2016-07-13 17 views
1

Ich brauche einen Plan für Build-Benachrichtigungen/Warnungen System.Benachrichtigungssystem/Dienst in C# mit ASP.NET MVC

Ich habe ein Objekt namens "Kampagne" und es hat "Status". Status kann angenommen, abgelehnt, ergänzt, Arbeit und andere sein. Ich möchte Benachrichtigungen/Warnungen senden, wenn sich der Status ändert.

E.q. E-Mail-Benachrichtigung und Warnung in meinem Portal.

Ich möchte nicht alles in einem Controller, wo ich auf Kampagne arbeiten. Also habe ich über Delegierte und Veranstaltungen nachgedacht. Aber letztens weiß ich nicht genug, um das zu machen.

Was ich denke:

Domain Modell:

class Campaign { 
    CampaignStatus Status { get; set;} 
} 
abstract class Notification { 
    // properties 
} 
class EmailNotification { 
    // properties specific for email 
} 
class Alert { 
    // properties specific for alerts 
} 
class CampaignAlert { 
    // properties specific for campaign alerts 
} 

Services: 
INotificationsService { 
    Send(); 
} 
IAlertsService : INotificationsService { 
    Get(); // I need showing list of alerts too 
    GetAll(); 
    Update(); // for updating info if alert was viewed. 
    Save(); // I need saving alerts in db. 
} 

Und wie ich es mit Ereignissen tun? So viel automatisch wie möglich. Natürlich kann ich den AlertsService manuell aufrufen und alarmieren. Aber das ist schlecht;)

Ich dachte darüber nach, Delegat und Event zu Campaign hinzuzufügen.

class Campaign { 
    public delegate void CampaignStatusChange(object sender, EventArgs e); 
    public event CampaignStatusChange OnCampaignStatusChange; 
} 

Und verbinden Veranstaltung mit:

class CampaignStatusChangeHandler { 
    public CampaignStatusChangeHandler(IRepository<bla bla> repository, INotificationsService notificationService) { 
     // these will be inject via ctor 
    } 

    // 
} 

Ich möchte machte es so viel wie ich kann mit SOLID, KISS und trocken. Natürlich mit TDD und I mit IoC, um Objekte zu injizieren;)

Zusammenfassung Ich brauche Benachrichtigungsdienst, den ich unabhängig senden E-Mails und Warnungen kann. Ich benötige Display-Warnungen am Frontend.

Mein Alarm Domain-Modell wie folgt aus:

public abstract class Notification 
{ 
    public string Title { get; set; } 
    public string Content { get; set; } 
    public DateTime Created { get; set; } 
    public NotificationType Type { get; set; } 
} 

public enum NotificationType 
{ 
    Email, 
    Alert 
} 

public class EmailNotification : Notification 
{ 
    public string From { get; set; } 
    public ICollection<string> To { get; set; } 
    public ICollection<string> Bcc { get; set; } 
} 

public class Alert : Notification 
{ 
    public object LinkedObject { get; set; } 
    public bool WasSeen { get; set; } 
} 
public class CampaignAlert : Alert 
{ 
    public CampaignAlertType CampaignAlertType { get; set; } 
} 
public enum CampaignAlertType 
{ 
    Accepted, 
    Rejected, 
    Active, 
    Finished 
} 

Wenn ich will Benachrichtigung an Benutzer senden ich E-Mail manchmal und Benachrichtigung gesendet werden soll. Manchmal möchte ich nur E-Mails senden und nur warnen.

Antwort

3

Ich würde Delegaten und Veranstaltungen hier nicht verwenden. Das Aufrufen einer Methode ist viel transparenter und Sie hätten keine Vorteile, Delegaten und Ereignisse zu verwenden.

Meine Struktur würde so aussehen:

interface ICampaignService 
{ 
    // It's business logic 
    // 1. Updates campaign 
    // 2. Creates notification using builder 
    // 3. Uses notification sender to send notification 
    // (4. creates alert object for notification) 
    void UpdateCampaignStatus(int campaignId, Status status); 
} 

// Builds different notifications based on different 
// campaign statuses. For instance assign different 
// email templates and use different text. 
interface INotificationBuilder<TNotification> where TNotification : Notification 
{ 
    TNotification Build(); 
} 

interface INotificationSender 
{ 
    Send(Notification notification); 
} 

interface IAlertsRepository 
{ 
    Get(); 
    GetAll(); 
    Update(); 
    Create(); 
} 

auch möglich (wenn es verschiedene Arten von Benachrichtigungen sind)

// If you want to send different types of notifications like 
// Email, Push, SMS etc. Each notification type requires different 
// logic for sending notification. Strategy pattern is perfect here. 
interface INotificationStrategy : INotificationSender 
{ 
    Send(Notification notification); 
} 

Es ist alles Erweiterbarkeit Anforderungen an Ihre Anwendung abhängt. SOLID ist sehr wichtig, aber vermeiden Sie Über-Engineering (Sie erwähnten KISS :)).

+0

Warum Builder und Strategie hier? – Nerf

+0

@Nerf Sie benötigen möglicherweise einen Benachrichtigungsersteller, um verschiedene Benachrichtigungen basierend auf dem Kampagnenstatus (verschiedene E-Mail-Vorlagen und/oder Text) zu erstellen. Benachrichtigungsstrategie wäre nützlich, wenn Sie verschiedene Arten von Benachrichtigungen haben, z. E-Mail-Benachrichtigung, SMS, Push usw. – Andrei

+0

Ok thx. Ich muss etwas mehr über diese Muster lesen, weil ich sie hier nicht sehe. – Nerf