SimpleInjector工厂委托——创建具有依赖关系的实例
本文关键字:依赖 关系 实例 创建 工厂 SimpleInjector | 更新日期: 2023-09-27 17:49:42
根据本文,如何创建通过构造函数获取依赖项的实例?
。
var container = new Container();
var factory = new RequestHandlerFactory(container);
factory.Register<DefaultRequestHandler>("default");
factory.Register<OrdersRequestHandler>("orders");
factory.Register<CustomersRequestHandler>("customers");
container.RegisterSingle<IRequestHandlerFactory>(factory);
现在,如果我要使用一些构造函数注入的依赖来创建OrdersRequestHandler
,像这样:
public OrdersRequestHandler(string uri, IOrderValidationService) {
// do something with deps
}
怎么做呢?
我已经尝试用构造函数参数注册实现,然后注册工厂,但这会导致一个错误,因为工厂无法创建实例。
您可以通过向RequestHandlerFactory
添加以下方法来做到这一点:
public void Register(string name, Func<IRequestHandler> factory) {
var producer = Lifestyle.Transient
.CreateProducer<IRequestHandler>(factory, container);
this.producers.Add(name, producer);
}
你可以这样使用:
factory.Register("orders", () => new OrdersRequestHandler(
"my uri",
container.GetInstance<IOrderValidationService>()));
然而,如果string uri
在多个组件中使用,您可能需要考虑将uri
隐藏在抽象之后。例如:
public interface ISomeWebServiceClientProxy {
Data LoadData();
}
class RealSomeWebServiceClientProxy : ISomeWebServiceClientProxy {
private readonly string uri;
public RealSomeWebServiceClientProxy(string uri) {
this.uri = uri;
}
public Data LoadData() {
// use uri, call web service, return data.
}
}
这样,OrdersRequestHandler
可以简单地依赖于ISomeWebServiceClientProxy
,而不是模棱两可的string
:
public OrdersRequestHandler(ISomeWebServiceClientProxy proxy,
IOrderValidationService service) {
// store dependencies
}