SimpleInjector Factory Delegates - 创建具有依赖项的实例

时间:2014-03-12 19:47:21

标签: c# dependency-injection simple-injector

基于文章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
}

怎么做?

我尝试使用构造函数参数注册实现,然后在工厂注册,但由于工厂无法创建实例,因此会导致错误。

1 个答案:

答案 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
}