1

我使用Ninject作爲DI,它爲每個請求創建了DbContext(對於所有服務都是單一的),並且我通常每個請求調用幾個服務方法(所以我不能在第一個服務方法被調用後處理DbContext)。在Ninject中處理

問題是,我應該讓WallService還是WallManager(以及其他服務和管理器)IDisposable和Dispose邏輯創建的?

我的業務邏輯層

namespace MySite.BLL.Services 
{ 
    public class WallService 
    { 
     WallManager wallManager; 

     public WallService(MybContext db) 
     { 
      wallManager = new WallManager(db); 
     } 
    } 
} 

我的數據訪問層

namespace MySite.DAL.Repositories 
{ 
    public class WallManager 
    { 
     MyDbContext db; 
     public WallManager(MyDbContext db) 
     { 
      this.db = db; 
     } 
    } 
} 

NinjectWebCommon.cs

kernel.Bind<MyDbContext>().ToSelf().InRequestScope().WithConstructorArgument<string>("MyMsSqlString"); 
kernel.Bind<WallService>().ToSelf().InRequestScope(); 

MyBaseController.cs

public class MyBaseController : Controller 
{ 
    [Inject] 
    public WallService WallService { get; set; } 

    // Other Services .. 
} 

回答

3

(這是一個多回答延長評論)

我敢肯定你不需要做到這一點 - 不僅如此,你不需要來,但你真的不該」在這種情況下t

事情是,你並不是自己創建DbContext實例 - 你將這個責任委託給IOC庫;在這方面,引用只是「通過」,所以你的類都不擁有它,不應該做任何可能破壞它的東西。

另外,DbContext是一個管理對象,所以你不需要Dispose它無論如何。 There is a very good answer on this site about this notion already,雖然它不直接解決您的問題,因此我沒有標記爲重複

有一點我注意到你的代碼,雖然。 您正在注入DbContext,然後使用它創建一個WallManager實例。這有點違背了依賴注入的目的。爲什麼不直接將WallManager注入WallService

public class WallService 
    { 
     readonly WallManager _wallManager; 

     public WallService(WallManager manager) 
     { 
      if (manager==null){ 
       throw new ArgumentNullException("manager"); 
      } 
      _wallManager = manager; 
     } 
    } 

Ninject(或任何其他IOC庫)不會有任何問題搞清楚,它需要創建和注入DbContextmanager依賴性,一旦你已經註冊的WallManager類型與它;這裏的想法是你註冊了所有可能的依賴類型,然後庫爲你構建對象圖。

這樣,您就不必採取的依賴上DbContext直接在您的WallService ...我猜你只把它才能創造WallManager無論如何 - 在WallService如果你是使用DbContext我建議你再看看設計,因爲你應該限制你的數據訪問到一層。

+0

謝謝。我不直接在我的BLL上使用DB。我會把經理注入服務 – dizar47