用统一的其他构造函数解析参数

我正在使用Unity并注入所有依赖项。 假设我有一个像这样的Manager

 public class Manager : IManager { public Manager(IRepository repository, string customerName) { } } 

和一个存储库类,如:

 public class Repository : IRepository { public Repository(string customerName) { } } 

我正在使用WCF,并将根据请求解析管理器和存储库。 我在服务启动时注册了所有类型,但在启动时我不知道“customerName”参数。 这将作为参数传递给WCF服务。 哪个会像这样解决经理:

 public class Service { private IUnityContainer _container; public Service(IUnityContainer container) { _container = container; } public void ServiceCall(string customerName) { var manager = _container.Resolve<IManager>( new ParameterOverrides { { "customerName", customerName} }); manager.DoSomething(); } } 

这样我就可以在每个请求中将customerName -parameter注入管理器。 这很好用。 但现在我还需要将它注入存储库。 有没有办法将customerName注入到存储库类中?

我知道我可以稍后手动设置它,但我想在构造函数中有这个。 另外,我不希望服务器知道存储库,所以我不想手动覆盖该参数。

我可以使用Manager中构造函数中的容器来解析IRepository ,但我宁愿只注入它就可以了。

我在服务启动时注册了所有类型,但在启动时我不知道“customerName”参数

换句话说,您的customerName参数是运行时数据。 在组件初始化期间将运行时数据注入组件是一种反模式 。

您的问题有两种可能的解决方案,但在您的情况下,最可能的解决方案是通过公共API传递参数,如下所示:

 public class Service { private readonly IManager _manager; public Service(IManager manager) { _manager = manager; } public void ServiceCall(string customerName) { _manager.DoSomething(customerName); } } 

这里更改了IManager接口,以便通过DoSomething方法传递customerName 。 因为在构造期间不再需要运行时值,所以不需要将Unity容器注入Service (这是Service Locator反模式的一种forms)。

对于第二种选择,请阅读本文 。