我有自己的模型,其中包含来自实体向导的映射实体:
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();
}
并且使用注释绑定我的构造函数注入仍然有效。
答案 0 :(得分:1)
据我所知,如果没有强类型的DbContext(具有DbSet属性),则无法使用LINQ连接。所以我会采用第二种方法,这对我来说更清洁。
答案 1 :(得分:0)
您的DbContext
消费者期待一个具体的消费者(例如,可以在Product
类上运行,即具有DbSet<Product>
类型的属性),因此您应该在API。否则,为您的存储库提供另一个上下文是合法的,并且在尝试获取一些DbSet
时它将在运行时失败。
如果您可以在编译器的帮助下消除可能的运行时错误,那么您应该。