Question

Based on the article here, how does one go about creating instances that take dependencies via constructor?

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);

Now if I were to create OrdersRequestHandler using some constructor injected dependencies like this:

public OrdersRequestHandler(string uri, IOrderValidationService) {
    // do something with deps
}

how would that be done?

I've tried registering the implementation with constructor arguments and then registering with the factory, but that results in an error as the factory is unable to create the instance.

Was it helpful?

Solution

You can do that by adding the following method to the RequestHandlerFactory:

public void Register(string name, Func<IRequestHandler> factory) {

    var producer = Lifestyle.Transient
        .CreateProducer<IRequestHandler>(factory, container);

    this.producers.Add(name, producer);
}

You can use it as follows:

factory.Register("orders", () => new OrdersRequestHandler(
    "my uri",
    container.GetInstance<IOrderValidationService>()));

However, if that string uri is used in more than one component, you might want to consider hiding that uri behind an abstraction. For instance:

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.
    }
}

This way the OrdersRequestHandler can simply take a dependency on ISomeWebServiceClientProxy instead of the ambiguous string:

public OrdersRequestHandler(ISomeWebServiceClientProxy proxy, 
    IOrderValidationService service) {
    // store dependencies
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top