在实现 DI 时,Mark Seemann 和 Misko Hevery 都说构造函数应该简单,并且应该只接收依赖项。他们不应该做任何其他事情。 (here 和 here)
然而,我常常想订阅传入的依赖项的事件,但是如果我在构造函数中这样做,那么构造函数不仅仅是接收它的依赖项,如果我不这样做,那么对象就不是完全初始化。
那么,在组合根中实例化那些需要订阅事件的对象, 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/