簡體   English   中英

在Ninject處理

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

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