Estoy tratando de descubrir cómo usar IoC en situaciones donde las clases dependientes pueden cambiar en función de alguna variable en la aplicación (en este caso, estado de la sesión). Por ejemplo, cada uno de nuestros clientes tiene una base de datos diferente, por lo que la conexión a la base de datos debe basarse en un valor almacenado en su Sesión (particularmente porque algunos usuarios pueden tener múltiples bases de datos si poseen múltiples negocios y cambiarían de base de datos) .Cómo configurar IoC cuando una clase de clave necesita Sesión (u otra variable específica del contexto)
Aquí es un ejemplo genérico de cómo nos Actualmente configurado esta estructura:
public class MyTestController : ControllerBase
{
Repository _rep;
public MyTest(Repository rep)
{
_rep = rep;
}
public MyTest()
{
string connString = String.Format("Server={0}; Database={1};"
, SessionContainer.ServerName, SessionContainer.DatabaseName;
var dc = new DataContext(connString);
_rep = new Repository(dc);
}
public int SampleFn()
{
return _rep.GetCountOfEmployees();
}
}
public class Repository
{
DataContext _context;
public Repository(DataContext context)
{
_context = context;
}
}
¿Seríamos capaces de hacerlo usando COI y eliminar los predeterminados c-res? ¿Si es así, cómo? No tengo ningún problema solo con usar D.I. así, pero me gustaría explorar la posibilidad de un StructureMap o Unity (nota: normalmente pasamos en db/server a una clase de fábrica que construye el contexto de datos ... el ejemplo de arriba es solo por brevedad).
Marca: ¿puede ser más específico o dar un ejemplo? Podríamos tener múltiples objetos de repositorio, todos los cuales necesitarían usar el mismo DataContext (para un procesamiento de transacción adecuado). No tengo problemas para registrar esto en el contenedor IoC cuando "DataContext" usa una cadena de conexión global o definida en el contenedor, pero ¿qué sucede cuando la cadena de conexión está en la sesión del usuario? Siento que me falta algo obvio. –
Agregué un ejemplo a mi respuesta. –
¡Ah, ja, creo que lo entiendo ahora! =) Te volví a votar abajo para poder votarte mañana por la doble victoria. Gran respuesta. –