用统一的其他构造函数解析参数
我正在使用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)。
对于第二种选择,请阅读本文 。