Pregunta

Estoy usando Autofac. Quiero inyectar una implementación diferente de una dependencia sobre la base de un atributo aplico al parámetro constructor. Por ejemplo:

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

Los atributos proporcionará los datos, tales como una cadena de conexión, que puedo usar para ejemplo el objeto correcto.

¿Cómo puedo hacer esto?

¿Fue útil?

Solución

Parece que usted quiere proporcionar diferentes implementaciones de IObjectContainer a CustomerRepository y FooRepository. Si ese es el caso, los atributos podría ser un delgada regla de metal . En su lugar, te voy a mostrar cómo iba a implementar múltiples implementaciones con Autofac.

(llamadas como .ContainerScoped() se han quedado fuera por razones de brevedad.)

En primer lugar, registrar una versión de IObjectContainer para cada cadena de conexión al nombrar las inscripciones:

builder
    .Register(c => new ObjectContainer(ConnectionStrings.CustomerDB))
    .As<IObjectContainer>()
    .Named("CustomerObjectContainer");

builder
    .Register(c => new ObjectContainer(ConnectionStrings.FooDB))
    .As<IObjectContainer>()
    .Named("FooObjectContainer");

A continuación, resolver los casos concretos en los registros del repositorio:

builder.Register(c => new CustomerRepository(
    c.Resolve<IObjectContainer>("CustomerObjectContainer"));

builder.Register(c => new FooRepository(
    c.Resolve<IObjectContainer>("FooObjectContainer"));

Esto deja los repositorios libre de la información de configuración:

class CustomerRepository
{
    public CustomerRepository(IObjectContainer db) { ... }
}

class FooRepository
{
    public FooRepository(IObjectContainer db) { ... }
}

Otros consejos

La respuesta de Bryan es lo suficientemente bueno, mientras que tener varios repositorios y tienen unos parámetros de constructor. Pero es difícil de configurar su raíz cuando se tienen muchos de ellos. Esto se puede conseguir mediante el escaneo de los metadatos de clase en la resolución de una interfaz. Cuando se obtiene información sobre sus parámetros puede resolver aplicación real de la misma. Véase mi respuesta aquí .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top