【发布时间】:2011-09-02 14:15:20
【问题描述】:
我正在使用实体框架构建一个存储库基类,所有实体存储库都将继承该基类。我想使用 Ninject 的依赖注入在基类中注入DatabaseContext。我认为构造函数注入是正确的方法,但是在派生类中使用构造函数注入进行此操作,我必须将参数传递给基类中的构造函数,而我不想要它。因此,Setter 注入更合适?
这是我的代码:
public abstract class BaseRepository<TEntity> : IDisposable
where TEntity : class
{
private readonly DatabaseContext _databaseContext;
protected BaseRepository(DatabaseContext databaseContext)
{
this._databaseContext = databaseContext;
}
}
在上面的示例中使用构造函数注入,在我的派生类中,我必须将 databaseContext 对象传递给基类,我不喜欢对我的所有派生类都这样做:
public class UsuarioRepository : BaseRepository<IUsuario>,
IUsuarioRepository
{
public UsuarioRepository(DatabaseContext databaseContext)
: base(databaseContext)
{
}
}
Setter Injection 而不是 Constructor Injection 是解决这个问题的好方法吗?最好的方法是什么?
更新:
使用 Setter 注入,我的派生类将没有构造函数:
public class UsuarioRepository : BaseRepository<IUsuario>, IUsuarioRepository
{
}
我的上下文只是所有应用程序中的一个。我不需要派生类来传递上下文对象,但我喜欢将它注入基类中,以便将来使用模拟进行测试。
我解决问题:
对不起,我对这个问题感到困惑,但我正在解决我建立工厂的问题:
public abstract class BaseRepository<TEntity> : IBaseRepository<TEntity>
where TEntity : class
{
private readonly ContextFactory _contextFactory = new ContextFactory();
protected DatabaseContext CurrentContext
{
get
{
return this._contextFactory.GetCurrentContext();
}
}
}
而我的派生类将如下所示:
public class UsuarioRepository : BaseRepository<IUsuario>, IUsuarioRepository
{
}
我的工厂就是这样:
public class ContextFactory
{
public DatabaseContext GetCurrentContext()
{
return new DatabaseContext();
}
}
【问题讨论】:
-
我不太明白你的问题。为什么你不喜欢通过构造函数将 DatabaseContext 传递给基类?您是否试图避免将上下文注入派生类?我看不出上面的代码有什么问题,所以我不确定你具体要解决什么“问题”。
-
我的派生类有一个基类的参数。使用 Setter 注入不会发生这种情况,我想知道在这种情况下使用 setter 注入是否是一个好方法。
-
将参数传递给基类有什么问题?
标签: c# .net dependency-injection inversion-of-control