【问题标题】:Disposing in Ninject在 Ninject 中处理
【发布时间】:2016-12-11 12:13:18
【问题描述】:

我将 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 ..
}

【问题讨论】:

    标签: c# asp.net-mvc entity-framework dependency-injection ninject


    【解决方案1】:

    (这更像是一个扩展评论而不是一个答案)

    我很确定您不需要这样做 - 在这种情况下,不仅您不需要需要,而且您真的不应该 .

    问题是,您并没有自己创建 DbContext 实例 - 您将该责任委托给 IOC 库;在这方面,引用只是“传递”,因此您的任何类都没有它,也不应该做任何可能破坏它的事情。

    另外,DbContext 是一个托管对象,因此无论如何您都不需要DisposeThere 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 库)将毫无问题地确定它需要创建 DbContext 并将其注入到 manager 依赖项中,一旦您使用它注册了 WallManager 类型;这里的想法是你注册所有可能的依赖类型,然后库为你构建对象图。

    这样你就不必直接在你的WallService 中依赖DbContext...我猜你只是为了创建WallManager 而使用它——如果你是WallService中使用DbContext我建议你再看看设计,因为你应该将数据访问限制在一层。

    【讨论】:

    • 谢谢。我不直接在我的 BLL 上使用 DB。我会将管理器注入服务
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    相关资源
    最近更新 更多