Unity 多个长度为 3 的构造函数
Unity Multiple Constructors of Length 3
我正在尝试制作一个 class,它有两个构造函数,都带有三个参数。如果将添加用户,则调用一个构造函数,如果刚刚更新用户,则调用另一个构造函数:
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)));
但这当然行不通。 "container.Resolve" 部分我缺少什么?
I am trying to make a class that has two constructors, both with three arguments
这就是你出错的地方。您的应用程序组件应该正好有 1 个 public 构造函数。如 here 所述,拥有多个是一种反模式。简而言之:
multiple constructors are redundant, ambiguous, make your DI configuration fragile, and lead to maintainability issues.
在您的情况下,您有一个具有 IAddRequestHandler
依赖关系的构造函数和另一个具有 IUpdateRequestHandler
依赖关系的构造函数。
您可能想要实现的是构建一个对象图,其中仅包含当前请求所需的依赖项,但由于多种原因这没有意义。
首先,由于 injection constructors should be simple,对象图(即使是非常大的图)的构建应该非常快。所以试图优化这个没有意义。从这个角度来看,您的控制器应该有一个构造函数,并且它应该接受(并要求)class 需要的所有依赖项。
这也可能表明您的控制器实际上做了太多事情,因此违反了单一职责原则。您可能应该将此控制器拆分为两个单独的 classes,每个都有(仍然)一个构造函数。这会立即使您的对象图也变窄变小。
我正在尝试制作一个 class,它有两个构造函数,都带有三个参数。如果将添加用户,则调用一个构造函数,如果刚刚更新用户,则调用另一个构造函数:
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)));
但这当然行不通。 "container.Resolve" 部分我缺少什么?
I am trying to make a class that has two constructors, both with three arguments
这就是你出错的地方。您的应用程序组件应该正好有 1 个 public 构造函数。如 here 所述,拥有多个是一种反模式。简而言之:
multiple constructors are redundant, ambiguous, make your DI configuration fragile, and lead to maintainability issues.
在您的情况下,您有一个具有 IAddRequestHandler
依赖关系的构造函数和另一个具有 IUpdateRequestHandler
依赖关系的构造函数。
您可能想要实现的是构建一个对象图,其中仅包含当前请求所需的依赖项,但由于多种原因这没有意义。
首先,由于 injection constructors should be simple,对象图(即使是非常大的图)的构建应该非常快。所以试图优化这个没有意义。从这个角度来看,您的控制器应该有一个构造函数,并且它应该接受(并要求)class 需要的所有依赖项。
这也可能表明您的控制器实际上做了太多事情,因此违反了单一职责原则。您可能应该将此控制器拆分为两个单独的 classes,每个都有(仍然)一个构造函数。这会立即使您的对象图也变窄变小。