2017-03-05 70 views
0

我閱讀了一些關於類似主題的文章。我有一個部分倉庫使用Ninject跨資料庫共享Singleton dbContext

public class EFPartRepository : IPartRepository 
    { 
     private ItemDBEntities dbContext = null; 
     public EFPartRepository(ItemDBEntities dbContext) 
     { 
      this.dbContext = dbContext; 
     } 
    } 

我會用另一個倉庫命名的圖像庫

public class EFUploadedImageRepository : IUploadedImageRepository 
{ 
    private ItemDBEntities dbContext = null; 
    public EFUploadedImageRepository(ItemDBEntities dbContext) 
    { 
     this.dbContext = dbContext; 
    } 
} 

因爲他們將在同一請求中使用,我希望他們的請求期間共享的DbContext的單,所以不會有任何異常「一個實體對象不能被IEntityChangeTracker的多個實例引用」

這是我原來的Ninject註冊碼。

private static void RegisterServices(IKernel kernel) 
    { 
     kernel.Bind<IPartRepository>().To<EFPartRepository>(); 
     kernel.Bind<IUploadedImageRepository>().To<EFUploadedImageRepository>(); 
    } 

所以我的問題是,這裏是初始化這個單身的最佳場所,所以它可以通過不同的全球資源庫很容易使用?以及如何申報? (最糟糕的情況是在每次調用期間總是傳遞dbContext作爲參數)。

謝謝!

回答

1

首先,以一個單綁定,簡單地做: kernel.Bind<ItemDBEntities>.To<ItemDBEntities>().InSingletonScope();

然而,你可能要考慮這個問題。 definiton的SingletonScope只要內核存活就會存活。因此,除非您在應用程序生命週期的某個位置重新創建內核,否則基礎數據庫連接將在整個生命週期內保持打開狀態。 任何SQL實現將具有有限的(即使非常大的)可用連接數量(通常受到可用的TCP套接字數量的限制)。這意味着,如果您的應用程序的許多副本正在運行,則無法再運行。

此外,這種方法將迫使連接長期居住。這將如何恢復?如果在一個存儲庫中引發異常,導致單例數據庫上下文具有損壞狀態會怎麼樣?

更經常的方法是設置一個存儲庫,並在解析範圍內創建一個上下文。

如果您想共享一個底層上下文,然後創建一個IMyDBContext,將其註冊到解析範圍(例如對於web-> request範圍),然後注入這兩個存儲庫。它們將具有相同的上下文,實體可以在兩者之間共享,但是會爲每個分辨率重新創建連接。

+0

非常感謝!我會試一試。也許我應該有一個dbContext容器,並將其作爲一個單例,由所有存儲庫共享。該容器最初將dbConext設置爲null。當請求到達時,控制器構造函數將獲得一個存儲庫,並創建dbContext,以便所有存儲庫都可以訪問它,因爲容器是共享的。一旦請求結束,它就會被銷燬。 – Chris

+0

@Chris正確。 – zaitsman