[Databases] MongoDB with .NET: Chat client (CrowdChat)


11
MongoDB and using MongoDB with .NET
 
2. Create a chat database in MongoLab
  • ­The database should keep messages
  • ­Each message has a text, date and an embedded field user
  • ­Users have username
3.Create a Chat client, using the Chat MongoDB database
  • ­When the client starts, it asks for username
    • ­Without password
  • ­Logged-in users can see
    • ­All posts, since they have logged in
    • ­History of all posts
  • ­Logged-in users can post message
  • ­Create a simple WPF application for the client

SOURCE CODE

Изтегли проекта като .zip

Накратко за решението:

  • CrowdChatValidation валидатор: името на потребителя и съдържанието на коментара се валидират.
  • Зареждането на коментарите става напълно асинхронно, т.е. дори да се теглят много коментари UI-a няма да забие.
  • Коментарите се обновяват, ако е необходимо на 500 милисекунди асинхронно, пуснал съм Refresh метод на отделна нишка.
  • Информацията за текущия потребител пазя в клас UserSession, който има Name и LoggenOn свойства.
  • Има и конзолен клиент, който показва всички постове.
  • CrowdChatModule за добавяне на нов пост и вземане на всички постове от начална до крайна дата, като всичко налива в StringBuilder.

Връзка с базата данни (MongoLab):

В момента работи с база в MongoLab, а това е connection string-a -[mongodb://admin:telerik@ds035280.mongolab.com:35280/crowdchat], а името на базата е crowdchat, ако някой иска да се върже. - Порта е блокиран в Академията.

Ако искате да работи с локална база данни, просто променете Connection string-a в CrowdChat.Data.MongoDbContext -> конструктора -> подавате ConnectionStrings.Default.MongoDbLocalServer вместо .MongoDbCloudServer.

Ако някой го кефи, може да го подобри (особено визуалната част :D ), също така е оставено място за филтриране на постове по начална и крайна дата.

Поздрави!




Отговори



1
Доста добре си го спретнал .. явно имаш излишно време :)
За нишките може да пробваш с някакви флагове да проверяваш в while цикъла и да break-ваш .. така би трябвало като затвориш приложението да се унищожат.
За textarea-та с постовете може да override-неш OnTextChanged() евента или да го наследиш тоя клас и да си напишеш custom логиката.
Доста съм noob с WPF, така че може и да не са много адекватни предложенията :)
Поздрави !

от dzhenko (3893 точки)


0
То за нишките сигурно има по-добро решение от моето, но това, което съм направи го тествах и работи, не прави мизерии.
За другото когато остане време, има много начини за решение, а пък съм го направил колкото да работи коректно, адекватно и бързо (дори вземането на бройката на постовете трябва да е асинхронен метод, иначе всичко заспива на бял екран). :>

от martin.nikolov (4535 точки)

0
дам, това с нишката е малко грозно, по-добре ще стане с DispatcherTimer. И както долу saykor ти е казал, по-добре всеки message да го пъхаш в един ObservableCollection, който е bind-нат към Listbox или нещо такова. И за да е съвсем културно, в ObservableCollection-а може направо да слагаш Post обекти ;)

от xenry (22 точки)


3

CrowdChatModule за добавяне на нов пост и вземане на всички постове от начална до крайна дата, като всичко налива в StringBuilder.

Сложи ListView ili GridView и просто да bindnesh към observablecollection<string>. Така като идват нови постове само добавяш към observablecollection и то ти се изплюва на екрана.


от saykor (8845 точки)


0
От къде мога да погледна малко интро към WPF, че не съм много запознат?

от sa66eto (1945 точки)


0
http://telerikacademy.com/Courses/Courses/Details/48
https://www.youtube.com/user/TelerikAcademy/search?query=wpf

от teleriknetwork (2734 точки)

0
Ето тук правих Workshop за intro to WPF за пролетната академия: https://www.youtube.com/watch?v=JMWezk7qq10

от DonchoMinkov (12706 точки)


4

Ето и моето, аз реших да избирам от кога да показвам постовете с DatePicker, а за асинхроното взимане на данните взаимствах от Мартин, понеже не съм наясно с материята. Първоначално го бях направил синхронно и работеше прилично, но така е по-добре.

Визуално е горе-долу ок, а е и responsivе.

Source

Bin


от dimo.petrof (2887 точки)


0
Евала за дизайна... поиграл си си... мен ме домързя... :D


0
Мерси! Дизайна не отне много време, но аз бях пипвал WPF по време на OOП отборната работа. Интересен проблем обаче се появи с датите, които зависят от клиентската машина и при чат участници чиито часовници се различават се хронологията се разваля. Порових се да видя дали в MongoDB не може да се остави поставянето на дата и час на сървъра, но не успях да открия подобно нещо. Както и да е де, като за домашно е ок :)

от dimo.petrof (2887 точки)



4

Ето едно кратко решение от мен. Не е WPF, но пък е само 30 реда:

MongoChat (source)

MongoChat (release)

Ново съобщение се въвежда директно след промпта. Всички съобщения могат да се видят с натискане на Enter. 


от neutrino (3376 точки)


0
Как мога да добавям ListBoxItems в ListBox.
listPosts.Items.Add(new ListBoxItem { Content = "Content" })
Дава следната грешка.
Additional information: The calling thread must be STA, because many UI components require this.

от TodorDimitrov (757 точки)


0
Пробвай така :
ListBoxItem listBoxItem = new ListBoxItem(); listBoxItem.Content = "Content"; listPosts.Items.Add(listBoxItem );

от penjurov (1466 точки)

0
същата работа!

от TodorDimitrov (757 точки)



3

Код | Архив

Да покажа и аз моето творение. Разделил съм си го по проекти, както обичайно. Добавил съм един сингълтон(контролерът), които да се грижи за всичко, взимане на съобщения, запазване на съобщения, запазване на потребител и т.н.

Добавих WPF приложение за UI и още едно конзолно, което да извиква два пъти това от WPF, за да може да се види нагледно как работи чата. За да обновявам съобщенията съм използвал DispatcherTimer, който на всяка една секунда проверява дали има нужда да се обновят съобщенията.

Ето и снимка на приложението.


от Nikolay_Radkov (2911 точки)


4
Тази задача се реализира по-правилно с webservice който да кисне между различните инстанции на WPF програмата и базата данни.
Така няма нужда WPF клиента да пита постоянно: има ли ново съобщение, има ли ново съобщение, има ли ново съобщение, има ли ново съобщение, има ли ново съобщение, има ли ново съобщение
Досадно е. Представете си, че вас постоянно ви питат едно и също нещо. ( Дончо знае :) ) Няма ли да е по-добре ако вие си кажете като имате ново съобщение вместо постоянно да ви питат X на брой хора ( инстанции на WPF клиента )
За целта се ползва някаква notification система като pubnub, parse, signalR. Клиента праща съобщение до сървъра. Той го записва в базата. Нотифицира останалите свързани в момента инстанции на WPF програмата че има нова информация. Директно може да им я прати в този случай. Те като получат новото съобщение си го изписват на екрана.
Тук има няколко предимства.
1. Не си отваряте базата данни за достъп до всеки, защото минава през webservice връзката с нея.
2. Може да си ползвате програмата от всякъде. При затворена база данни трябwа да се около нея. Този проблем при mongolab и cloud бази го няма, но не винаги така стоят нещата.
3. Може да кеширате данни на webservicа за да не се допитвате до базата за едно и също нещо. Примерно нов клиент на програмата ако се свърже може от кеша да му се дадът старите съобщения, а не да се вземат от базата.
4. Не се товари постоянно мрежата с трафик да питате едно и също.
5. Не товарите излишно сървъра Дончо да отговаря постоянно на всички инстанции, че не е проверил още изпитите :)
6. Може да се направят на други езици и платформи клиенти които да работят през същия webservice
Та за да Ви е по-интересно като минете webservice курса може да си разширите програмата. Pubnub се ползва с няколко реда код.

от saykor (8845 точки)