集中多个事件订阅

Centralize multiple event subscriptions

我刚刚介绍了工作中的事件和委托,核心问题之一是。 "How would you centralize the event subscriptions?"

在过去的 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 分离的最佳方法是什么? 他们是否有任何区分多个订阅的模式?

我希望这是有道理的。任何 help/advice 将不胜感激。

此致,

泰兹·温菲尔德

我的咨询答案是:视情况而定。

你的例子有一个大问题:

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

如果您不想这样,并且希望将 ChangeLog 和 RollbackLog 与 CustomerRepository 分离,那么一种有效的方法是使用 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();
     }    
}

现在,如果您不想使用回滚或更改日志,只需创建一个名为 "SkipChangeLog" 的 class,它派生自 IChangeLog,所有方法都是空的。

如果您想让 CustomRepository 与 ChangeLog 和 RollbackLog classes 分离,那么您应该研究事件聚合器模式。这种模式的一个例子是 Prism 库中的 EventAggregator class。

(请注意,您无需使用整个 Prism 方式即可使用 EventAggregator class。)