3

在实现 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
}
4

2 回答 2

1

是的,在这里连接组合根中的事件将是正确的方法。

于 2013-08-22T14:29:34.653 回答
0

这个答案主要是基于意见的。

我通常不使用DI表示层,因为我认为最好的用途DI是在域(业务)层中创建一个持久性无知类。但是,它的用途DI是针对无国籍service阶级。它处理任何指定状态的请求并且是无事件的,因此消除了service类内部事件的需要。

您想要创建的可能是一个control类,而不是service类,因此,分配事件在这里是一个真正的问题。但是,我不认为连接事件违反了构造函数规则,因为它只是分配事件。

  1. 为什么是无事生非?

    它接受请求并处理它。如果您需要做一些事情,例如:afterProcessbeforeProcess等,您可以在类中定义特定事件,并将接口作为依赖项传递。

  2. 如果我需要基于事件怎么办?

    有时您需要在某些情况下传递事件。您可以使用Func(或java中的适配器)进行参数注入,而不是在构造函数中挂钩它。

于 2013-08-27T02:06:07.700 回答