2013-08-22 22 views
1

在實現DI時,Mark Seemann和Misko Hevery都聲稱構造函數應該很簡單,並且應該只接收依賴關係。他們不應該做任何事情。 (herehere依賴注入 - 訂閱組合根中的事件而不是構造函數

不過,我常常想訂閱的依賴關係傳遞事件,但如果我這樣做的構造函數,那麼構造函數超過接收它的依賴,如果我不,那麼對象沒有完全初始化。

那麼實例化那些需要訂閱組合根中的事件的對象,連接它們的事件,然後注入那些實例化的對象是否正確?

例如:

// 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方法需要是公共的,這是不可取的。它也隱藏了Panel正在訂閱Button事件的事實,這對於試圖閱讀和理解該類的人來說也不是理想的。 – jrahhali

回答

0

是,佈線了在組合物中的根中的事件將是這裏的正確的方法。

0

此答案主要是基於意見的。

我通常不會使用DI來表示層,因爲我認爲DI的最佳使用是在域(業務)層中創建一個持久性無知類。儘管如此,使用DI的目的是爲了達到無狀態的service類。它處理請求而不管任何指定的狀態,並且是無事件的,因此消除了類內部事件的需要。

您要創建的可能是control類,而不是service類,因此,在此分配事件是一個真正的問題。但是,我認爲佈線事件並不違反構造函數規則,因爲它只是分配事件。

  1. 爲什麼它是無狀態的?

    它接受請求並處理它。如果您需要執行如下操作:afterProcessbeforeProcess等,您可以在類中定義特定事件,並將接口作爲依賴項傳遞。

  2. 如果我需要基於事件做什麼?

    有時您需要通過的事件in some cases。你可以使用Func(或java中的適配器)來完成參數注入,而不是將它掛在構造函數中。

相關問題