我正在尽我所能地追求稳定,在棱镜应用程序中工作时,我面临着以下问题:
我有一个类来处理模块从其他模块接收到的所有事件。由于类有两种责任(注册处理程序和处理事件),所以我决定将类分成两部分,这导致我将事件处理程序公之于众(无论如何,这似乎很奇怪)。
在这种情况下,您希望在一个类中有两个责任,或者事件处理程序是公开的(或者其他我遗漏的东西)?
致以问候。
编辑:
public class Handler
{
public void MethodHandlingAggregatedEvent()
{
}
}
public class Register
{
....
public void RegisterHandler()
{
this.eventAggregator.GetEvent<XXX>().Subscribe(this.handler.MethodHandlingAggregatedEvent);
}
}发布于 2014-04-28 13:29:34
为了更好地解释我的答案,请考虑以下示例:
ModuleX和ModuleYEventA和EventB是在两个模块可以访问它们的地方定义的。ModuleX包含两个事件的事件处理程序。ModuleY触发这些事件。还请考虑SOLID的以下方面(来自维基百科)
单责任原则:类应该只有一个责任(也就是说,软件规范中的一个潜在更改应该能够影响类的规范) 接口隔离原理:“许多特定于客户端的接口都优于一个通用接口。”
映射到此示例时所描述的功能的要求如下:
如果有一个单独的类同时处理A和B,那么就违反了单一责任原则。如果使用在同一类中定义的处理程序注册事件处理程序,也将违反单一责任原则。
那么现在呢?把每一件事分开都会产生四个类别,因为这些显然都是不同的责任。维基百科( Wikipedia )认为,简单地扩展和修改现有代码是可靠的原则;因此,它应该能让你的生活变得更容易,而不是更困难。
如果创建四个类,则必须将事件处理程序代码打开到在其中创建的类之外的作用域。在我看来,保留事件处理代码以及尽可能小范围内的注册将是一个更好的选择:
class MyHandler
{
public MyHandler(IEventAggregator eventAggregator)
{
eventAggregator.GetEvent<EventA>().Register(HandleEventA);
}
private void HandleEventA(EventArgs args)
{
}
}MyHandler现在负责处理EventA。即使它也在注册处理程序;人们可能仍然认为这是事件处理程序的一部分。
发布于 2016-04-18 14:21:19
我觉得你的设计基本上没问题。
Register负责事件处理程序映射。我建议将方法RegisterHandler()重命名为RegisterHandlers(),以反映它的行为。还使所有类实现接口。因此,您可以在单元测试中像这样模拟它们:
_registerMock.Verify(x => x.RegisterHandlers(), Times.Once);
_eventAggregator.Invoke(SomeEvent);
_someHandler.Verify(x => x.MethodHandlingAggregatedEvent(), Times.Once);https://stackoverflow.com/questions/23341833
复制相似问题