我有一个 BaseRepository ,它依赖DbContext
来执行数据库操作:
public abstract class BaseRepository<TEntity> : IBaseRepository<TEntity> where TEntity : Entity
{
...
}
我不想使用构造函数依赖注入插入此依赖项,因为如果我使用,我需要在派生存储库的构造函数中传递这些依赖项。我也不想使用 Property / Setter Dependency Injection ,因为 Property / Setter Dependency Injection 表示依赖是可选的,但实际情况并非如此。
我的DbContext
继承自IDbContext
界面,其中 UnitOfWork Pattern :
public class DbContext : System.Data.Entity.DbContext, IDbContext
{
...
}
我使用 Ninject 设置IDbContext
:
public override void Load()
{
Bind<IDbContext>().To<DbContext>().InRequestScope();
}
我的问题是如何在Base Repository中注入DbContext
,我在requestScope中需要一个DbContext
的实例。 (使用工厂?)
答案 0 :(得分:3)
通常,因为您的存储库需要 DBContext
,您应该使用构造函数注入 - 上下文不是可选的。
如果您的存储库实例是使用Ninject创建的,那么您需要传入DBContext
并不重要 - 将为您解决依赖关系。
如果您想“手动”创建存储库实例,可以使用已具有DBContext
依赖关系的工厂,以便消费者不必担心它。
答案 1 :(得分:0)
我使用Ninject的服务定位器找到了解决方案,并收回了DbContext
的实例:
public class ExampleClass()
{
protected DbContext DbContext
{
get
{
//Here I do the trick I wanted
return DependencyResolverFactory.Instance.Get<IDbContext>() as DbContext;
}
}
...
}
我的Dependency Resolver类:
public static class DependencyResolver
{
private static IKernel _kernel;
static DependencyResolver()
{
_kernel = new StandardKernel();
_kernel.Load(Assembly.GetExecutingAssembly());
}
public static IKernel GetCurrentKernel()
{
return _kernel;
}
public static void RegisterKernel(IKernel kernel)
{
_kernel = kernel;
}
public static T Get<T>()
{
return _kernel.Get<T>();
}
}