在Ninject处理

时间:2016-12-11 12:13:18

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

我使用Ninject进行DI,它为每个请求创建DbContext(所有服务都是单个),我通常会为每个请求调用几个服务方法(所以我不能在调用第一个服务方法后处理DbContext)。

问题是,我应该使WallService或WallManager(以及其他服务和管理器)具有IDisposable以及Dispose逻辑创建的内容吗?

我的业务逻辑层

(\d{2}:\d{2})

我的数据访问层

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

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

NinjectWebCommon.cs

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

MyBaseController.cs

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

1 个答案:

答案 0 :(得分:3)

(这是一个扩展的评论而非答案)

我很确定你不需要这样做 - 不仅仅是你不需要,但你真的不应该在这种情况下

问题是,你不是自己创建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。 1}}用它输入;这里的想法是你注册所有可能的依赖类型,然后库为你构建对象图。

通过这种方式,您不必直接在DbContext中依赖WallService ...我猜您只是为了创建WallManager而只接受它 - 如果您 使用DbContext中的WallService,我建议您再次查看设计,因为您应该将数据访问限制在一个层。