[英]Disposing in Ninject
我使用Ninject進行DI,它為每個請求創建DbContext(所有服務都是單個),我通常會為每個請求調用幾個服務方法(因此我在調用第一個服務方法后無法處理DbContext)。
問題是,我應該使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 ..
}
(這是一個擴展的評論而不是答案)
我很確定你不需要這樣做 - 不僅僅是你不需要 ,但在這種情況下你真的不應該這樣做。
問題是,你不是自己創建DbContext
實例 - 你將這個職責委托給IOC庫;在這方面,引用只是“通過”所以沒有你的類擁有它,不應該做任何可能垃圾的事情它。
此外, DbContext
是一個托管對象,因此您無需Dispose
它。 關於這個概念 , 這個網站上有一個非常好的答案 ,雖然它沒有直接解決你的問題因此我沒有標記為重復
有一點我注意到你的代碼。 您正在注入DbContext
,然后使用它來創建WallManager
實例。 這有點打敗了依賴注入的目的。 為什么不直接將WallManager
注入WallService
?
即
public class WallService
{
readonly WallManager _wallManager;
public WallService(WallManager manager)
{
if (manager==null){
throw new ArgumentNullException("manager");
}
_wallManager = manager;
}
}
一旦你用它注冊了WallManager
類型, Ninject
(或任何其他IOC庫)就DbContext
它需要創建並將DbContext
注入到manager
依賴項中。 這里的想法是你注冊所有可能的依賴類型,然后庫為你構建對象圖。
這樣你就不必直接在你的WallService
依賴DbContext
......我猜你只是為了創建WallManager
只是為了創建WallManager
- 如果你也在 WallService
使用DbContext
我會建議你另外查看設計,因為您應該限制對一個圖層的數據訪問。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.