gpt4 book ai didi

c# - SimpleInjector Factory Delegates - 创建具有依赖关系的实例

转载 作者:太空宇宙 更新时间:2023-11-03 13:26:08 25 4
gpt4 key购买 nike

基于文章here ,如何创建通过构造函数获取依赖项的实例?

例如

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 使用一些构造函数注入(inject)的依赖项,如下所示:

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
}

关于c# - SimpleInjector Factory Delegates - 创建具有依赖关系的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22362278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com