在实现DI时,Mark Seemann和Misko Hevery都声称构造函数应该很简单,并且应该只接收依赖关系。他们不应该做任何事情。 (here和here)依赖注入 - 订阅组合根中的事件而不是构造函数
不过,我常常想订阅的依赖关系传递事件,但如果我这样做的构造函数,那么构造函数超过接收它的依赖,如果我不,那么对象没有完全初始化。
那么实例化那些需要订阅组合根中的事件的对象,连接它们的事件,然后注入那些实例化的对象是否正确?
例如:
// 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
}
我刚刚意识到,为了将事件连接到组合根,OnButtonClick方法需要是公共的,这是不可取的。它也隐藏了Panel正在订阅Button事件的事实,这对于试图阅读和理解该类的人来说也不是理想的。 – jrahhali