SimpleInjector - Registrar múltiples conexiones de bases de datos

c# dapper ormlite-servicestack simple-injector

Pregunta

Estoy trabajando con un WebApi existente que usa SimpleInjector para registrar una única conexión de base de datos. Necesito hacer un punto final para obtener información de un db diferente, pero no sé cómo registrar una nueva conexión.

Estos son los registros existentes para el db principal:

_container.Register<IDataBaseSqlServerDapper>(
    () => new DataBaseSqlServerDapper(SqlServerDb.ConnectionString(),
    LogManager.GetLogger("")));

_container.RegisterWebApiRequest<IDbConnectionFactory>(
    () => new OrmLiteConnectionFactory(SqlServerDb.ConnectionString(),
    new SqlServerOrmLiteDialectProvider()));

_container.RegisterWebApiRequest(
    () => new PetaPoco.Database(Connection.SurveyEngine) {
        IsolationLevel = IsolationLevel.Snapshot
    });

Entonces, leí acerca del método RegisterCollection e intenté lo siguiente:

_container.RegisterCollection<IDataBaseSqlServerDapper>(new[]
{
   new DataBaseSqlServerDapper(SqlServerDb.ConnectionString(), LogManager.GetLogger("")),
   new DataBaseSqlServerDapper(AdmbbDb.ConnectionString(), LogManager.GetLogger(""))
});

_container.RegisterCollection<IDbConnectionFactory>(new[]
{
    new OrmLiteConnectionFactory(
        SqlServerDb.ConnectionString(), 
        new SqlServerOrmLiteDialectProvider()),
    new OrmLiteConnectionFactory(
        AdmbbDb.ConnectionString(), 
        new SqlServerOrmLiteDialectProvider())
});

_container.RegisterCollection<PetaPoco.Database>(new[]
{
     new PetaPoco.Database(Connection.SurveyEngine) { 
        IsolationLevel = IsolationLevel.Snapshot },
     new PetaPoco.Database(Connection.Admbb) { 
        IsolationLevel = IsolationLevel.Snapshot }
});

SqlServerDb, AdmbbDd y Connection son clases que contienen los nombres de las cadenas de conexión.

Pero estoy obteniendo este error:

La configuración no es válida. No se pudo crear la instancia para el tipo IDapperQueryFactory. El constructor de tipo DapperQueryFactory contiene el parámetro con el nombre 'dataBaseSqlServerDapper' y escribe IDataBaseSqlServerDapper que no está registrado. Asegúrese de que IDataBaseSqlServerDapper esté registrado o cambie el constructor de DapperQueryFactory. Sin embargo, hay un registro para IEnumerable <IDataBaseSqlServerDapper>; ¿Quería depender de IEnumerable <IDataBaseSqlServerDapper>?

¿Como puedo resolver esto?

Respuesta popular

En el caso existente, especifique que el tipo IDataBaseSqlServerDapper se puede utilizar para inyección, que a su vez se inyecta correctamente en su objeto (en este caso, una clase que implementa IDapperQueryFactory ).

En el segundo caso, está registrando múltiples servicios de tipo IDataBaseSqlServerDapper . Lo que significa que su DI no sabe cómo resolver un solo IDataBaseSqlServerDapper , solo una colección de ellos.

Esto significa que tendrá que cambiar el constructor para aceptar IEnumerable<IDataBaseSqlServerDapper> o registrar una no colección IDataBaseSqlServerDapper

Su documentación enumera un buen ejemplo de cómo puede usar Register and RegisterCollection uno al lado del otro para que funcione ( fuente ).


Ahora en cuanto a su problema, usted declara:

Necesito hacer un punto final para obtener información de un db diferente, pero no sé cómo registrar una nueva conexión.

Si simplemente desea cambiar el destino de los datos, ¿no puede simplemente reemplazar el antiguo controlador existente?

Si su objetivo es cargar datos de múltiples fuentes de datos, necesitará tener algún tipo de lógica que permita que su código determine qué fuente debe usar para almacenar / cargar datos.

El ejemplo de la documentación de SimpleInjector proporciona una buena base para algo como esto que no requiere que reescribas las clases que usan un IDataBaseSqlServerDapper inyectado.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué