我使用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();
答案 0 :(得分:3)
(这是一个扩展的评论而非答案)
我很确定你不需要这样做 - 不仅仅是你不需要,但你真的不应该在这种情况下
问题是,你不是自己创建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库)在您注册{DbContext
时,确定它需要创建并向manager
依赖项注入WallManager
。 1}}用它输入;这里的想法是你注册所有可能的依赖类型,然后库为你构建对象图。
通过这种方式,您不必直接在DbContext
中依赖WallService
...我猜您只是为了创建WallManager
而只接受它 - 如果您 使用DbContext
中的WallService
,我建议您再次查看设计,因为您应该将数据访问限制在一个层。