C# 集中多个事件订阅

C# 集中多个事件订阅,c#,events,delegates,C#,Events,Delegates,Iv'e刚刚介绍了活动和工作中的代表,其中一个核心问题是。 “您将如何集中事件订阅?” 在过去的3-4天里,iv'e一直在处理事件和委托,因此我们可以解耦并避免依赖关系 业务层: //Code omitted for readability Public Class CustomerRepository { //Delagte/Event here //Some method that updates the Customer public void Updat

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

在过去的3-4天里,iv'e一直在处理事件和委托,因此我们可以解耦并避免依赖关系

业务层:

 //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解耦的最佳方法? 他们是否有区分多个订阅的模式

我希望这是有意义的。如有任何帮助/建议,将不胜感激

问候,


Tez Wingfield

我的答案是:视情况而定

你的例子有一个大问题:

1) 它允许用户构建CustomerRepository,而无需更改日志和RollbackLog。你想要吗

如果您不希望这样,并且希望将ChangeLog和RollbackLog与CustomerRepository解耦,那么一种有效的方法就是使用

通常,这是通过将所有依赖项带到构造函数来实现的。因此,您的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();
     }    
}
方法是这样的:

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

如果您想保持CustomRepository与变更日志和RollbackLog类的解耦,那么您应该研究事件聚合器模式。这种模式的一个例子是Prism库中的类


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

感谢您提供的链接……这正是我想要的,但它似乎已经过时,没有真正使用过。我不想在方法论上倒退。还有其他想法吗?另外,我不想拼凑出一个解决方案,我希望有一个模式可以遵循。忽略最后的评论。经过进一步的研究,它似乎仍然被广泛使用。Pluralsight视频和最新文章。谢谢你的指点!也许我的问题有点含糊。理想情况下,我希望坚持活动模式。是的,脱钩仍然需要成为一个可行的选择,因为这可能会变得相当大。我需要一种集中订阅的方法,也许可以从UI开发人员那里抽象出来。您的答案似乎符合ISP模式。永远不会有不那么好的答案。