依赖注入 - 在组合根中订阅事件而不是构造函数

3
当实现依赖注入时,Mark Seemann和Misko Hevery都表示构造函数应该简单,并且只接收依赖项。它们不应该做其他任何事情。(这里这里
然而,我经常希望订阅传递的依赖项的事件,但如果我在构造函数中这样做,则构造函数会执行更多任务,而如果我不这样做,则对象尚未完全初始化。
那么,在组合根中实例化需要订阅事件的对象,连接它们的事件,然后注入这些实例化的对象是否正确?
例如:
// Composition root
Panel panel = new Panel();
Button button = new Button();
panel.OnButtonClick += button.Click;

Register<Panel>().AsSingle(panel);
Register<Button>().AsSingle(button);

// Panel Class
private Button _button;

public Panel(Button button)
{
    _button = button;
}

void OnButtonClick()
{
    // handle button click
}

与之相对的是:
//composition root
Register<Panel>().AsSingle(panel);
Register<Button>().AsSingle(button);

// Panel Class
private Button _button;

public Panel(Button button)
{
    _button = button;
    OnButtonClick += button.Click
}

void OnButtonClick()
{
    // handle button click
}

1
我刚刚意识到为了使事件在组合根上挂钩,OnButtonClick方法需要变成public,这并不理想。它还隐藏了Panel订阅Button事件的事实,这对于试图阅读和理解类的人也不是理想的情况。 - jmrah
(我只是礼貌地问一下,没有批评的意思)这个(同样是Seemann领域)回答了吗?https://blog.ploeh.dk/2013/09/11/di-and-events-composition/ - granadaCoder
2个回答

1
是的,在组合根中连接事件是正确的做法。

0

这个答案主要基于个人观点。

我通常不使用 DI 到表示层,因为我认为最好使用 DI 来创建领域(业务)层中的持久性无关类。尽管使用 DI 是为了使得状态无关的 service 类,处理请求而不受任何特定状态和事件的影响,从而消除了 service 类内部事件的需求。

您想要创建的可能是一个 control 类,而不是 service 类,因此在这里分配事件是一个真正的问题。然而,我认为布线事件并不违反构造函数规则,因为它只是分配事件。

  1. 为什么它是无事件的?

    它接受请求并处理它。如果您需要像 afterProcessbeforeProcess 等这样的操作,您可以在类中定义特定的事件,并将接口作为依赖项传递。

  2. 如果我需要基于事件的操作怎么办?

    有时您需要在某些情况下传递事件 (链接)。您可以使用 Func(或 Java 中的适配器)进行参数注入,而不是在构造函数中挂钩。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接