集中多个事件订阅

时间:2015-03-13 20:23:24

标签: c# events delegates

我刚刚介绍了工作中的事件和代表,其中一个核心问题是。 “你如何集中活动订阅?”

在过去的3-4天里,我一直在处理事件和代表,因此我们可以解耦并避免依赖。

业务层:

 //Code omitted for readability
 Public Class CustomerRepository
 { 
    //Delagte/Event here

    //Some method that updates the Customer
    public void Update()
    {
      //Update Magic

      //Fire if subscribed
      OnUpdateCustomer();
    }
 }

 //Methods that will fire when invoked
 Public Class ChangLog
 {

    //Some method that fires when subscribed
    public void OnUpdateCustomer()
    {
      //Some Magic
    }
 }
 Public Class RollbackLog
 {
    //Method that fires when subscribed
    public void OnUpdateCustomer()
    {
      //Some Magic
    }
  }

所以现在提出的问题是,如果添加更多功能,UI开发人员需要订阅事件 并记住每个事件方法的位置和人员。 UI层:

无论是Webforms还是MVC

,代码都会有所不同
public void btnClick_OnClick()
{
     CustomerRepository repo = new CustomerRepository();

     ChangeLog changeLog = new ChangeLog();
     repo.CustomerUpdated += changeLog.OnCustomerUpdated;

     RollbackLog rollbackLog = new RollbackLog();
     repo.CustomerUpdated += rollbackLog.OnCustomerUpdated;

     repo.Update();
     //So if more functionality is added then it can get quite cumbersome for the UI developer
}

所以问题是,避免UI创建订阅但仍然能够将CustomerRepo解耦的最佳方法是什么? 他们是否可以将多个订阅分组?

我希望这是有道理的。任何帮助/建议将不胜感激。

此致

Tez Wingfield

2 个答案:

答案 0 :(得分:0)

我的咨询答案是:这取决于。

你的例子有一个大问题:

1)它允许用户在没有ChangeLog和RollbackLog的情况下构建CustomerRepository。你想要吗?

如果您不想这样,并且您想从CustomerRepository中分离ChangeLog和RollbackLog,那么一种有效的方法是使用DI

通常,这是通过将所有依赖项引入构造函数来实现的。所以你的CustomerRepository构造函数看起来像这样:

public CustomerRepository(IChangeLog changeLog, IRollbackLog rollbackLog)
{
   this.changeLog = changelog;
   this.rollbackLog = rollbackLog;
}

和方法将是这样的:

public void Update()
{
     //Update Magic
     try 
     {
        changeLog.LogUpdateCustomer();
     } 
     catch(Exception ex)
     {
         rollbackLog.Rollback();
     }    
}

现在,如果您不想使用rollback或changelog,只需创建一个名为“SkipChangeLog”的类,该类派生自IChangeLog,并且所有方法都是空的。

答案 1 :(得分:0)

如果您希望将CustomRepository与ChangeLog和RollbackLog类分离,那么您应该查看Event Aggregator模式。这种模式的一个例子是Prism库中的EventAggregator类。

(请注意,为了使用EventAggregator类,您不需要使用整个Prism方式。)