En ASP.NET 5, tengo una interfaz IRepository que usé para acceder a algunas bases de datos, como esta:

public interface IRepository {
    IQueryable<T> QueryItems(string sql);
}

public class Repository : IRepository {

    private readonly string ConnectionString;

    public Repository(string connStr) {
        // Save the injected connection string
        this.ConnectionString = connStr;
    }

    public IQueryable<T> QueryItems(string sql) {
        // Implementation ignored here
    }
}

En mi clase Startup.cs, estoy registrando el IoC / DI así:

services.AddTransient<IRepository>(s => new Repository("DUMMY_CONNSTR"));

Todo eso funciona bien si solo tengo una cadena de conexión. Sin embargo, ¿cómo puedo registrarme y posteriormente inyectar el IRepository correcto si uso el Repositorio para conectarme a 2+ bases de datos diferentes con diferentes cadenas de conexión?

services.AddTransient<IRepository>(s => new Repository("DUMMY_CONNSTR"));
services.AddTransient<IRepository>(s => new Repository("DIFFERENT_CONNSTR"));

En sistemas IoC / DI más antiguos, habría usado implementaciones "nombradas" que podrían resolverse con algo como un atributo [Dependency("DUMMY")] en el parámetro del constructor.

Cualquier ayuda sería apreciada.

2
cwiederspan 27 ene. 2016 a las 01:24

2 respuestas

La mejor respuesta

Hay algunos enfoques que puede tomar, uno es inyectar una fábrica y, en base a los criterios específicos, puede producir un repositorio, el otro enfoque es usar un Dispatcher que también produce la base del repositorio en los criterios, a continuación hay una pregunta que yo Pregunte con el mismo problema. La siguiente pregunta tiene ambos enfoques, pero estaban codificando una versión beta de .net core

Vea esta pregunta como referencia y código

1
Community 23 may. 2017 a las 12:18

Puede sustituir StructureMap o Autofac por el contenedor DI predeterminado (consulte my entrada de blog para obtener instrucciones detalladas). Ambos admiten el registro de interfaz "con nombre" (StructureMap instancias con nombre y Autofac servicios con nombre y clave).

Además, si apunta a dnx451, puede usar el atributo WithKey de Autofac. Con el proyecto de muestra de Visual Studio de la publicación del blog, agregue la siguiente dependencia en project.json:

"frameworks": {
  "dnx451": {
    "dependencies": {
      "Autofac.Extras.AttributeMetadata": "4.0.0"
    }
  }
},

Dada una clase de prueba con el siguiente constructor:

public MyClass([WithKey("logging")] IRepository repository)
{
    Repository = repository;
}

Registraría todo en ConfigureServices (tenga en cuenta el uso de WithAttributeFilter():

containerBuilder.Register(c => new Repository("DEFAULT_CONNSTR")).Keyed<IRepository>("default");
containerBuilder.Register(c => new Repository("LOGGING_CONNSTR")).Keyed<IRepository>("logging");

containerBuilder.RegisterType<MyClass>().WithAttributeFilter();
0
Jeff Ogata 28 ene. 2016 a las 03:33