基于文章here,如何创建通过构造函数获取依赖项的实例?
E.g。
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
}
怎么做?
我尝试使用构造函数参数注册实现,然后在工厂注册,但由于工厂无法创建实例,因此会导致错误。
答案 0 :(得分:1)
您可以通过将以下方法添加到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
}