Wie würde ich eine globale Benachrichtigungsklasse erstellen?

8

Noch ein bisschen neu in c # und ich brauche einige Hinweise in die richtige Richtung mit diesem ..

Ich möchte ein Benachrichtigungssystem in C # / Asp.net erstellen, das es verschiedenen Methoden auf der gesamten Site erlaubt, Nachrichten und Nachrichtentypen zu einer statischen Liste hinzuzufügen, die beim nächsten Laden der Seite durchlaufen werden kann. Es wäre ähnlich wie beim Stack-Überlauf die Banner-Benachrichtigungen für Erfolge auf jeder Seite geladen werden (zB "Du verdientes x Abzeichen", du verdientes Abzeichen "). Irgendeine Idee, wie ich eine globale Methode enthüllen könnte, dass andere einfach Nachricht gehen könnten. hinzufügen ('Nachricht', 'Nachrichtentyp') mit?

Bearbeiten:

Es wurde vorgeschlagen, dass ich Session.Add("Notificiations", myList); verwende, um die Nachrichten zu speichern.

Wie / wo würde ich die "Notifications" -Liste initialisieren und dann list.add () überall sonst machen?

    
tester 20.06.2011, 17:51
quelle

4 Antworten

6

Sie können eine Klasse wie diese schreiben (ich habe keine IDE in meiner Nähe, also hoffe ich, dass der Code kompiliert wird):

%Vor%

Um eine Nachricht hinzuzufügen, würden Sie tun:

%Vor%

(Diese Nachrichten werden in der Sitzung gespeichert, dh benutzerspezifisch);

Nehmen wir an, Sie haben ein Literal in Ihrer Hauptseite, wo Sie Ihre Nachrichten anzeigen möchten:

%Vor%

In Ihrer MasterPage würden Sie den OnInit Eventhandler hinzufügen :

%Vor%

Dies sollte Ihnen einen grundlegenden Überblick geben, wie Sie die Nachrichten speichern und anzeigen können. Natürlich können Sie diesen Code anpassen, indem Sie entweder eine Methode zum Löschen von Nachrichten oder nette Client-Nebeneffekte (wie die Benachrichtigungen hier auf StackOverflow) hinzufügen. Um herauszufinden, wie das gemacht wird, können Sie die Suche verwenden mal)

Ich hoffe, das hilft dir.

    
citronas 20.06.2011, 18:00
quelle
9

Das Anzeigen von Popup-Bannern oben auf der Seite bei Postbacks ist ziemlich ordentlich, aber noch cooler als das ist die Verwendung von jQuery und Ajax, um regelmäßige Überprüfungen mit dem Server durchzuführen, um zu sehen, ob sich der Status von etwas geändert hat oder in Ihrem Fall der Benutzer hat irgendwelche "neuen" Nachrichten.

Das funktioniert wirklich gut, wenn Sie einen asynchronen Prozess auf dem Webserver laufen haben und Sie nicht wissen, wie lange es dauern wird (oder Sie sicher wissen, dass es wirklich lange dauern wird) und Sie nicht Ich möchte nicht, dass der Browser Ihres Clients gebunden wird, wenn Sie darauf warten. Unter Verwendung von Javascript und window.setInterval können Sie eine Funktion alle 30 Sekunden (oder was auch immer Sie möchten) auftreten, und Sie haben dann diese Funktion einen Ajax-Post für den Server, um zu sehen, ob der asynchrone Prozess abgeschlossen ist. In Ihrem Fall würde der Ajax-Post einfach den Server fragen, ob der Benutzer irgendwelche "neuen" Nachrichten hat. Wenn der Benutzer neue Nachrichten hat, ist es eine einfache Sache, jQuery zu verwenden, um ein verstecktes div auf der Seite anzuzeigen, das den Benutzer darüber informiert, dass er neue Nachrichten hat.

Es ist ein bisschen eine komplizierte Lösung und könnte die Fähigkeiten eines Amateurs übersteigen, aber die Gewinne sind es wert!

  • Lässt Ihre Webanwendung statischer und "bewußter" erscheinen als Änderungen auf dem Server
  • Verzichtet auf überflüssige Seitenaktualisierungen, die die Benutzerfreundlichkeit beeinträchtigen können

Und wie andere schon bemerkt haben, ist der beste Ort, um "globale" Informationen zu speichern, normalerweise die Sitzung (beachten Sie nur den begrenzten Umfang der Sitzung). MSDN ASP.NET-Sitzungsstatus

Wenn es sich jedoch um Daten handelt, auf die jeder Client zugreifen muss, können Sie diese im Anwendungscache speichern. ASP.NET-Caching

Natürlich sollten Sie darauf achten, wie viel Sie in der Session oder im Cache speichern. Es ist einfach, sich in den Fuß zu schießen.

    
Jagd 20.06.2011 18:21
quelle
1

Ich würde vorschlagen, dies als einen Service zu definieren, der als ein WCF / Web-Service oder eine Schnittstelle innerhalb Ihrer Web-App implementiert werden kann.

Wenn Sie diese Funktion als Service nutzen, haben Sie einige Vorteile wie Skalierbarkeit, Verfügbarkeit usw. Als Beispiel sendet ein Client, der Ihre iphone-App verwendet, die Nachricht, und ein anderer Client, der Ihre Website verwendet, kann dies sehen.

Wenn Sie den zweiten Ansatz bevorzugen, müssen Sie ein DI-Framework wie Ninject verwenden und sicherstellen, dass DI / Ioc-Frameworks ein Singleton-Muster auf die Instanz anwenden.

Ich kann Ihnen hier einen Beispielcode geben, aber ich kann es nicht tun, bis ich wieder nach Hause komme.

    
gido 24.06.2011 09:59
quelle
1

Ich denke, der Code, den ich unten habe, könnte eine gute Kombination der verschiedenen Antworten sein. Es verwendet einen Webdienst, um neue Benachrichtigungen abzurufen und jquery, um Benachrichtigungen in einem Intervall abzurufen. Es speichert die Benachrichtigungen in der Benutzersitzung.

Zunächst einmal unsere einfache "Message" -Klasse, die eine einzelne Nachricht darstellt. Ich bemerkte in Ihrer Frage, dass Sie mehrere Arten von Nachrichten haben würden, also wollte ich sicherstellen, dass Sie eine Lösung bereitstellen, die ths abdeckt. Meine Nachrichtenklasse hat nur zwei Eigenschaften: Text und Typ. Type wird in meiner Demo als Hintergrundfarbe für die Nachricht verwendet.

%Vor%

Weiter ist unsere UserMessages-Klasse, die das Speichern und Abrufen von Nachrichten behandelt. Es speichert alle Nachrichten in der Benutzersitzung.

%Vor%

Für meine Demo habe ich mich entschieden, die Nachrichten mit AJAX zu lesen, indem ich einen ASP.Net Webservice, ScriptManager und jquery kombiniere. Hier ist mein Webservice:

- ASMX-Datei -

%Vor%

- CS Datei -

%Vor%

Auf meiner Aspx-Seite habe ich einen Skriptmanager mit einem Verweis auf meinen Dienst, einen div-Platzhalter für Nachrichten und eine schnelle und unreine Nachrichtenhinzufügungsschnittstelle erstellt:

%Vor%

Um die Erstellung von Nachrichten zu unterstützen, habe ich folgende Code-Methode hinzugefügt, um das Ereignis click click zu behandeln:

%Vor%

Jetzt für das wichtige Stück. Um die eigentliche Anzeige der Nachrichten zu machen, habe ich den folgenden JavaScript-Block geschrieben (hauptsächlich mit jquery, habe ich v1.4.1 benutzt, aber Sie können die gewünschte Version verwenden). Der Timer wird in einem Intervall von 30 Sekunden eingestellt. Dies bedeutet, dass es 30 Sekunden vor der ersten Verarbeitung wartet. Um sofort beim Laden der Seite zu verarbeiten, fügen Sie CheckMessages(); direkt vor dem setInterval hinzu, um eine sofortige Überprüfung beim Laden der Seite durchzuführen. Wenn Sie setInterval belassen, können Sie regelmäßig Nachrichten aktualisieren.

%Vor%

Beachten Sie im obigen Codeblock, dass ich e.Text verwende, das mit dem Namen unserer Eigenschaft im Code übereinstimmt, und e.Type. e.Type wird hier als unsere Hintergrundfarbe angegeben, würde aber wahrscheinlich für etwas anderes im wirklichen Leben verwendet werden. Außerdem befinden sich alle diese CSS-Attribute im echten Leben in einer CSS-Klasse (wahrscheinlich eine einzelne CSS-Klasse für jeden Nachrichtentyp). Ich habe einen "Schließen" -Button hinzugefügt, den Sie nicht erwähnt haben, aber ich dachte mir, dass die Leute die Benachrichtigungen schließen möchten.

Eine coole Sache bei dieser Implementierung ist, dass wenn Sie unterwegs feststellen, dass Sie Nachrichten NICHT in der Sitzung speichern müssen, sondern beispielsweise in einer Datenbank, wird diese Implementierung reibungslos damit umgehen. Ändern Sie einfach UserMessages.GetMessages, um aus einer db / anderen Position zu ziehen, und Sie sind festgelegt. Darüber hinaus können Sie festlegen, dass globale Nachrichten behandelt werden, indem Sie sie aus dem Cache lesen und zusätzlich Benutzermeldungen aus der Sitzung lesen.

    
Peter 27.06.2011 14:09
quelle

Tags und Links