使用ASP.NET MVC的C#中的通知系统/服务

时间:2016-07-13 18:10:24

标签: c# asp.net-mvc events delegates solid-principles

我需要制定通知/警报系统的计划。

我的对象名为" Campaign"它有"状态"。状态可以是接受,拒绝,补充,工作等。 我希望在状态发生变化时发送通知/警报。

如参见。门户中的电子邮件通知和警报。

我不想在我操作Campaign的一个控制器中完成所有操作。所以我在考虑代表和活动。但最后我不知道应该这样做。

我在想什么:

域名模型:

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. 
}

我怎么能用事件做到这一点?这么多自动就可以了。当然,我可以手动调用AlertsService并发出警报。但这很糟糕;)

我正在考虑向Campaign添加委托和事件。

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

将事件与:

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

    // 
}

我想用SOLID,KISS和DRY尽可能多地制作它。有TDD和我使用IoC注入对象;)

总结我需要通知服务,我可以独立发送电子邮件和警报。我需要在前端显示警报。

我的警报域模型:

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
}

当我想向用户发送警报时,我希望有时发送电子邮件并提醒。 有时我想只发送电子邮件而只发送警报。

1 个答案:

答案 0 :(得分:3)

我不会在这里使用代表和事件。调用方法更加透明,使用委托和事件不会有任何好处。

我的结构看起来像那样:

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();
}

也可以(如果有不同类型的通知)

// 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);
}

这完全取决于您的应用程序扩展性要求。 SOLID非常重要,但要确保避免过度工程(你提到过KISS :)。