集中多个事件订阅
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。)
我刚刚介绍了工作中的事件和委托,核心问题之一是。 "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。)