统一长度为3的多个构造函数

时间:2017-11-10 20:59:50

标签: c# dependency-injection unity-container

我正在尝试创建一个具有两个构造函数的类,两个构造函数都有三个参数。如果要添加用户,则调用一个构造函数;如果用户刚刚更新,则调用另一个构造函数:

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

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

我知道Unity并不了解相同长度的多个构造函数,而且我一直试图解决这个问题。到目前为止,我只能找到有关长度为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)));

但是,这当然不起作用。我错过了什么&#34; container.Resolve&#34;片

1 个答案:

答案 0 :(得分:1)

  

我正在尝试创建一个具有两个构造函数的类,两个构造函数都有三个参数

这是你出错的地方。您的应用程序组件应该只有1个公共构造函数。如here所述,拥有多个是反模式。简而言之:

  

多个构造函数冗余,模糊,使您的DI配置变得脆弱,并导致可维护性问题。

在您的情况下,您有一个具有IAddRequestHandler依赖关系的构造函数和一个具有IUpdateRequestHandler依赖关系的不同构造函数。

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

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

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