我刚刚介绍了工作中的事件和代表,其中一个核心问题是。 “你如何集中活动订阅?”
在过去的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解耦的最佳方法是什么? 他们是否可以将多个订阅分组?
我希望这是有道理的。任何帮助/建议将不胜感激。
此致
Tez Wingfield
答案 0 :(得分:0)
我的咨询答案是:这取决于。
你的例子有一个大问题:
1)它允许用户在没有ChangeLog和RollbackLog的情况下构建CustomerRepository。你想要吗?
如果您不想这样,并且您想从CustomerRepository中分离ChangeLog和RollbackLog,那么一种有效的方法是使用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();
}
}
现在,如果您不想使用rollback或changelog,只需创建一个名为“SkipChangeLog”的类,该类派生自IChangeLog,并且所有方法都是空的。
答案 1 :(得分:0)
如果您希望将CustomRepository与ChangeLog和RollbackLog类分离,那么您应该查看Event Aggregator模式。这种模式的一个例子是Prism库中的EventAggregator类。
(请注意,为了使用EventAggregator类,您不需要使用整个Prism方式。)