2013-08-22 21 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中的适配器)来完成参数注入,而不是将它挂在构造函数中。

相关问题