DI を実装する場合、Mark Seemann と Misko Hevery は、コンストラクターは単純であるべきであり、依存関係のみを受け取るべきであると述べています。彼らは他に何もすべきではありません。(こことここ)
ただし、渡された依存関係のイベントをサブスクライブしたいことがよくありますが、コンストラクターでこれを行うと、コンストラクターは依存関係を受け取る以上のことを行います。そうしないと、オブジェクトは完全に初期化されません。
では、コンポジション ルートでイベントをサブスクライブする必要があるオブジェクトをインスタンス化し、それらのイベントをフックして、インスタンス化されたオブジェクトを注入するのは正しいでしょうか?
例えば:
// 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
}