在我的基础存储库中注入上下文的最佳方法是什么?

时间:2011-10-17 17:29:31

标签: .net entity-framework domain-driven-design repository unit-of-work

我有一个 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的实例。 (使用工厂?)

2 个答案:

答案 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>();
    }
}