Estoy creando una clase base de repositorio con Entity Framework donde heredarán todos los repositorios de Entidades. Quiero inyectar el DatabaseContext
en la clase base usando Dependency Injection usando Ninject. Creo que la inyección de Constructor es la correcta, pero al hacer esto con Constructor Injection en la clase derivada I tendré que pasar el parámetro al constructor en la clase base y no lo quiero. Por lo tanto, ¿una Inyección Setter es más apropiada?Inyección de dependencia de constructor en la clase base
Aquí está mi código:
public abstract class BaseRepository<TEntity> : IDisposable
where TEntity : class
{
private readonly DatabaseContext _databaseContext;
protected BaseRepository(DatabaseContext databaseContext)
{
this._databaseContext = databaseContext;
}
}
Usando Constructor de inyección en el ejemplo anterior, en mi clase derivada que se debe a pasar DatabaseContext objeto de clase base, no me gusta hacer esto con todo mi clase derivada:
public class UsuarioRepository : BaseRepository<IUsuario>,
IUsuarioRepository
{
public UsuarioRepository(DatabaseContext databaseContext)
: base(databaseContext)
{
}
}
Setter inyección en lugar de Constructor de inyección es una buena manera de resolver esto? ¿Cuál es la mejor manera?
Actualización:
usar la inyección de Setter de mi clase derivada no tener constructores:
public class UsuarioRepository : BaseRepository<IUsuario>, IUsuarioRepository
{
}
mi contexto es único en toda la aplicación. No necesito una clase derivada para pasar el objeto de contexto, pero me gusta inyectarlo en la clase base para usar simulaciones para pruebas en el futuro.
que resolver el problema:
Lo siento, estoy confundiendo con la pregunta, pero yo soy la solución de mi problema de la construcción de una fábrica:
public abstract class BaseRepository<TEntity> : IBaseRepository<TEntity>
where TEntity : class
{
private readonly ContextFactory _contextFactory = new ContextFactory();
protected DatabaseContext CurrentContext
{
get
{
return this._contextFactory.GetCurrentContext();
}
}
}
Y mi clase derivada se parecerá que:
public class UsuarioRepository : BaseRepository<IUsuario>, IUsuarioRepository
{
}
Y mi fábrica así:
public class ContextFactory
{
public DatabaseContext GetCurrentContext()
{
return new DatabaseContext();
}
}
No entiendo muy bien su pregunta. ¿Por qué no le gusta pasar el DatabaseContext a la clase base a través del constructor? ¿Estás tratando de evitar tener que inyectar el contexto a la clase derivada? No veo nada de malo con el código anterior, así que no estoy seguro de qué "problema" estás tratando de resolver específicamente. – fearofawhackplanet
Mi clase derivada tiene un parámetro para la clase base. Usando Setter Injection esto no ocurrirá, quiero saber si usar setter injection en esa situación es una buena manera. –
¿Qué pasa con pasar un parámetro a la clase base? – Phil