在實現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