c# - 依赖注入(inject)——订阅组合根而不是构造函数中的事件

标签 c# events constructor dependency-injection compositionroot

在实现 DI 时,Mark Seemann 和 Misko Hevery 都说构造函数应该简单,并且应该只接收依赖项。他们不应该做任何其他事情。 (herehere)

然而,我常常想订阅传入的依赖项的事件,但是如果我在构造函数中这样做,那么构造函数不仅仅是接收它的依赖项,如果我不这样做,那么对象就不是完全初始化。

那么,在组合根中实例化那些需要订阅事件的对象, Hook 它们的事件,然后注入(inject)这些实例化的对象是否正确?

例如:

// 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
}

最佳答案

是的,连接组合根中的事件是这里的正确方法。

关于c# - 依赖注入(inject)——订阅组合根而不是构造函数中的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18383271/

相关文章:

c# - 如何知道c#中的循环持续时间

javascript - 在谷歌地图中找到一个圆圈内的所有经纬度

c# - 创建事件处理程序 +=

javascript - 当事件 $emit 发出时,Vue $on 不运行我的函数,即使我可以看到在 Vue 控制台中触发的事件

c++ - 深度复制 c++ - 如果给出指向该类的指针,则复制该类

c# - 比较两个相同的字符串列表

c# - 在 WPF 中绘制一个可拉伸(stretch)的圆括号

android - 如何在 WindowManager 添加的 View 中捕获按键

wpf - MVVM:绑定(bind)一个将构造函数参数传递给 UserControl 的 ViewModel

javascript - 在 JavaScript 中访问对象的枚举成员