2017-11-10 114 views
0

我试图做一个有两个构造函数的类,它们都带有三个参数。统一长度为3的多个构造函数

public class RequestController : IRequestController 
{ 
    public RequestController(IConnector, IAddRequestHandler, IAddReplyHandler) { ... } 

    public RequestController(IConnector, IUpdateRequestHandler, IUpdateReplyHandler) { ... } 
} 

我知道,团结不升值同样长度的多个构造和我一直在试图解决:如果用户刚刚更新一个构造函数被调用,如果用户将被添加,其他这个问题。到目前为止,我只能找到详细的解释,如果有长度为1的多个构造函数这是我到目前为止有:

var container = new UnityContainer(); 
container.RegisterType<IRequestController, RequestController>("addConstructor", 
    new InjectionConstructor(typeof(IMQSeriesConnector), typeof(IAddRequestHandler), typeof(IAddReplyHandler))); 
container.RegisterType<IRequestController, RequestController ("updateContructor", 
    new InjectionConstructor(typeof(IConnector), typeof(IUpdateRequestHandler), typeof(IUpdateReplyHandler))); 

我认为下一步是沿着线的东西:

container.Resolve<IRequestController>("addConstructor", 
    new DependencyOverride(typeof(IConnector), typeof(IAddRequestHandler), typeof(IAddReplyHandler))); 
container.Resolve<IRequestController>("updateConstructor", 
    new DependencyOverride(typeof(IRequestController), typeof(IAddRequestHandler), typeof(IAddReplyHandler))); 

但是,这当然是行不通的。我错过了什么“container.Resolve”片?

+1

这似乎有点怪异......不知道,但我会避免使用[Dependency]装饰的属性,并跳过构造注入。 – Will

回答

1

我试图做一个类有两个构造,都与三个参数

这是你出问题。你的应用程序组件应该有一个公共构造函数。具有多个是反模式,如解释here。总之:

多个构造函数是多余的,暧昧的,让你的DI配置脆弱,导致可维护性的问题。

你的情况,你有一个构造函数与IAddRequestHandler依赖性和不同的构造与IUpdateRequestHandler依赖。

你可能试图实现的是构建一个只包含当前请求所需的依赖关系的对象图,但这对多种原因没有意义。

首先,自injection constructors should be simple以来,对象图(甚至是非常大的)的构建应该非常快。所以试图优化这个没有意义。从这个角度来看,你的控制器应该有一个构造器,并且它应该接受(并且要求)所有类需要的依赖。

这也可能表明您的控制器实际上做得太多,因此违反了单一责任原则。你可能应该把这个控制器分成两个独立的类,每个类都有(仍然)一个构造函数。这立即使您的对象图更窄,更小。