簡體   English   中英

使用Ninject管理DbContext的最佳實踐

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM