[英]Best practises with managing DbContext with Ninject
我有自己的模型,其中包含來自實體向導的映射實體:
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>()
但是,當我在Google中搜索時,總是會看到不同的方法。 DbContext沒有在那里綁定,但是MyDbContext像這樣:
kernel.Bind<MyDbContext>().ToSelf().InRequestScope();
並注入像:
public class MyRepository : BaseRepository<Product>, IMyRepository
{
public MyRepository (MyDbContext _dbContext)
: base(_dbContext)
{
}
}
然后,我可以簡單地做(沒有Set <>):
_dbContext.Product()
您能告訴我這兩種綁定類型有什么區別嗎? 什么是更好的方法?
編輯:我注意到,當我刪除到MyDbContext的每個綁定時(在第二個示例中: kernel.Bind<MyDbContext>().ToSelf().InRequestScope()
),我的數據庫操作仍然有效(讀取數據等)。 對我來說,這很奇怪。 為什么會這樣呢?
所以我有:
private static void RegisterServices(IKernel kernel)
{
// DBContexts
//kernel.Bind<DbContext>().To<MyDbContext>().InRequestScope();
//kernel.Bind<MyDbContext>().ToSelf().InRequestScope();
}
並且使用注釋綁定,我的構造函數注入仍然有效。
據我所知,沒有強類型DbContext(具有DbSet屬性),您將無法使用LINQ連接。 因此,我將采用第二種方法,這對我來說更干凈。
您的DbContext
使用者希望有一個具體的使用者(例如,可以在Product
類上操作,即具有DbSet<Product>
類型的屬性),因此您應該在api中指定它。 否則,為存儲庫提供另一個上下文是合法的,並且在運行時嘗試獲取一些DbSet
時將失敗。
如果可以借助編譯器消除可能的運行時錯誤,則應該這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.