使用Ninject管理DbContext的最佳实践

时间:2015-07-06 12:38:11

标签: c# asp.net-mvc entity-framework ninject dbcontext

我有自己的模型,其中包含来自实体向导的映射实体:

public partial class MyDbContext : DbContext
{
    public MyDbContext()
        : base("name=MyDbContext")
    {
    }
}

我想将我的上下文注入我的存储库类。起初我有:

public class MyRepository : BaseRepository<Product>, IMyRepository 
    {
        public MyRepository (DbContext _dbContext)
            : base(_dbContext)
        {
        }
}

在NinjectWebCommon的RegisterServies中,我有:

kernel.Bind<DbContext>().To<MyDbContext>().InRequestScope();

如果我想使用我的实体,我必须写例如:

_dbContext.Set<Product>()

但是当我在谷歌搜索时,我总是看到不同的方法。 DbContext没有绑定,但MyDbContext喜欢:

 kernel.Bind<MyDbContext>().ToSelf().InRequestScope();

并注入如下:

public class MyRepository : BaseRepository<Product>, IMyRepository 
        {
            public MyRepository (MyDbContext _dbContext)
                : base(_dbContext)
            {
            }
    }

然后我可以简单地做(没有Set&lt;&gt;):

_dbContext.Product()

你能告诉我这两种绑定有什么区别吗?什么是更好的apporach?

编辑: 我注意到当我删除MyDbContext的每个绑定时(在我的第二个例子中:kernel.Bind<MyDbContext>().ToSelf().InRequestScope()),我的数据库操作仍然有效(读取数据等)。对我来说这很奇怪。为什么会这样?

所以我有:

private static void RegisterServices(IKernel kernel)
    {
        // DBContexts
       //kernel.Bind<DbContext>().To<MyDbContext>().InRequestScope();
       //kernel.Bind<MyDbContext>().ToSelf().InRequestScope();
    } 

并且使用注释绑定我的构造函数注入仍然有效。

2 个答案:

答案 0 :(得分:1)

据我所知,如果没有强类型的DbContext(具有DbSet属性),则无法使用LINQ连接。所以我会采用第二种方法,这对我来说更清洁。

答案 1 :(得分:0)

您的DbContext消费者期待一个具体的消费者(例如,可以在Product类上运行,即具有DbSet<Product>类型的属性),因此您应该在API。否则,为您的存储库提供另一个上下文是合法的,并且在尝试获取一些DbSet时它将在运行时失败。

如果您可以在编译器的帮助下消除可能的运行时错误,那么您应该。