Pregunta

Soy nuevo en la inyección de dependencias, me pregunto cómo manejaría el siguiente escenario. Tenemos algo como lo siguiente:

public class DatabaseContext
{
  public string ConnectionString {get;}
}

public interface IDataAccess
{
  string GetString(int id);
}

public class DataAccessImpl : IDataAccess
{
  private DatabaseContext _context;
  public DataAccessImpl(DatabaseContext context)
  {
    this._context=context;
  }

  public string GetString(int id)
  {
    return "some data";
  }
}

Para las aplicaciones web, cada solicitud podría crear un DatabaseContext diferente para apuntar a una base de datos diferente. Para los formularios de Windows podríamos cambiar el contexto de base de datos actual. ¿Cómo maneja un framework di una dependencia que puede cambiar? De modo que cuando solicito un IDataAccess siempre tiene el apropiado / actual DatabaseContext.

¿Fue útil?

Solución

El enfoque que he tomado no es inyectar un DataContext sino una fábrica de DataContext, una clase con un método que devuelve un DataContext del tipo apropiado. Tengo dos constructores para, en mi caso, una clase de controlador, el constructor predeterminado y uno que toma la fábrica (y otros objetos inyectados). El constructor predeterminado simplemente llama al constructor con parámetros con todos los parámetros nulos. El constructor parametrizado crea objetos de tipos predeterminados si el parámetro correspondiente es nulo.

Usar la fábrica permite que las acciones de mi controlador creen un nuevo DataContext cuando se invoca en lugar de tener un único DataContext que existe durante toda la vida de la aplicación. La fábrica podría construirse para devolver un contexto existente si está disponible y crear uno nuevo según sea necesario, pero prefiero incluirlos en una unidad de trabajo.

P.S. La fábrica realmente produce una clase de envoltura alrededor de un DataContext, no el DataContext real, como una interfaz (IDataContextWrapper). Esto hace que sea mucho más fácil burlarse de la base de datos real de mis pruebas de controlador. Todo lo anterior supone LINQ / ASP.NET MVC, pero los principios son generalmente aplicables, creo.

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