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
}

怎么做呢?

我已经尝试用构造函数参数注册实现,然后注册工厂,但这会导致一个错误,因为工厂无法创建实例。

SimpleInjector工厂委托——创建具有依赖关系的实例

您可以通过向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
}