Resolve dependency with autofac based on constructor parameter attribute
autofac, inversion-of-control
Solution
It sounds like you want to provide different implementations of `IObjectContainer` to `CustomerRepository` and `FooRepository`. If that is the case, attributes might be a thin metal ruler. Instead, I'll show you how I would implement multiple implementations with Autofac.
(Calls such as `.ContainerScoped()` have been left out for brevity.)
First, register a version of `IObjectContainer` for each connection string by naming the registrations:
builder
.Register(c => new ObjectContainer(ConnectionStrings.CustomerDB))
.As<IObjectContainer>()
.Named("CustomerObjectContainer");
builder
.Register(c => new ObjectContainer(ConnectionStrings.FooDB))
.As<IObjectContainer>()
.Named("FooObjectContainer");
Then, resolve the specific instances in the repository registrations:
builder.Register(c => new CustomerRepository(
c.Resolve<IObjectContainer>("CustomerObjectContainer"));
builder.Register(c => new FooRepository(
c.Resolve<IObjectContainer>("FooObjectContainer"));
This leaves the repositories free of configuration information:
class CustomerRepository
{
public CustomerRepository(IObjectContainer db) { ... }
}
class FooRepository
{
public FooRepository(IObjectContainer db) { ... }
}
Problem
I'm using Autofac. I want to inject a different implementation of a dependency based on an attribute I apply to the constructor parameter. For example: ``` class CustomerRepository { public CustomerRepository([CustomerDB] IObjectContainer db) { ... } } class FooRepository { public FooRepository([FooDB] IObjectContainer db) { ... } } builder.Register(c => /* return different instance based on attribute on the parameter */) .As<IObjectContainer>(); ``` The attributes will be providing data, such as a connection string, which I can use to instance the correct object. How can I do this?