![](/img/trans.png)
[英]Synchronization issue in multiple event subscriptions and getting latest snapshot
[英]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.