C# 集中多个事件订阅
Iv'e刚刚介绍了活动和工作中的代表,其中一个核心问题是。 “您将如何集中事件订阅?” 在过去的3-4天里,iv'e一直在处理事件和委托,因此我们可以解耦并避免依赖关系 业务层: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
//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模式。永远不会有不那么好的答案。