繁体   English   中英

集中多个事件订阅

[英]Centralize multiple event subscriptions

Iv'e刚刚介绍了工作中的事件和代表,而核心问题之一就是。 “您将如何集中活动订阅?”

在过去的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开发人员需要订阅事件,并记住在何处以及谁需要每种事件方法。 用户界面层:

代码因其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脱钩的最佳方法? 他们对分组多个订阅是否有明确的定义?

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

问候,

特兹·温菲尔德

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

您的示例有一个大问题:

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”的类,该类派生自IChangeLog,并且所有方法均为空。

如果要使CustomRepository与ChangeLog和RollbackLog类分离,则应查看Event Aggregator模式。 这种模式的一个示例是Prism库中的EventAggregator类。

(请注意,使用EventAggregator类无需使用整个Prism方法。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM