我试图创建一个有两个构造函数的类,两个构造函数都有三个参数。如果要添加用户,则调用一个构造函数;如果用户正在更新,则调用另一个构造函数:
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“的作品?
发布于 2017-11-11 10:24:27
我试图创建一个具有两个构造函数的类,两个构造函数都有三个参数。
这就是你出错的地方。您的应用程序组件应该有一个公共构造函数。如这里所解释,拥有多重是一种反模式。简言之:
多个构造函数是冗余的、模棱两可的,使DI配置变得脆弱,并导致可维护性问题。
在您的示例中,您有一个具有IAddRequestHandler依赖关系的构造函数和一个具有IUpdateRequestHandler依赖关系的不同构造函数。
您可能想要实现的是构建一个只有当前请求所需的依赖关系的对象图,但由于多种原因,这是没有意义的。
首先,由于注入构造函数应该是简单的,对象图(甚至是大图)的构造应该非常快。因此,试图优化这一点是没有意义的。从这个角度来看,控制器应该有一个构造函数,它应该接受(并且需要)类所需的所有依赖项。
它还可能表明您的控制器实际上做得太多了,因此违反了单一责任原则。您可能应该将这个控制器分成两个单独的类,每个类都有(仍然)一个构造函数。这立即使您的对象图更窄和更小。
https://stackoverflow.com/questions/47231042
复制相似问题