C# 使用ninject的MVC DBContext管理
我的项目使用MVC5、EF6和Ninject 我有一些组成业务层的服务类,只有它们才允许访问DbContext,这意味着控制器不能直接访问上下文 服务类别如下所示:C# 使用ninject的MVC DBContext管理,c#,asp.net-mvc,entity-framework,ninject,ninject.web.mvc,C#,Asp.net Mvc,Entity Framework,Ninject,Ninject.web.mvc,我的项目使用MVC5、EF6和Ninject 我有一些组成业务层的服务类,只有它们才允许访问DbContext,这意味着控制器不能直接访问上下文 服务类别如下所示: public interface IService1: IDisposable { IEnumerable<SomeDataType> GetSomeData(string param); void SaveData(); } public class Service1: IService1 {
public interface IService1: IDisposable
{
IEnumerable<SomeDataType> GetSomeData(string param);
void SaveData();
}
public class Service1: IService1
{
private MyContext context;
public Maestri(MyContext context)
{
this.context = context;
}
public void Dispose()
{
context.Dispose();
}
public IEnumerable<SomeDataType> GetSomeData(string Param)
{
[...]
}
public void SaveData()
{
[...]
context.SaveChanges()
}
}
public interface IService2: IDisposable
{
IEnumerable<SomeDataType2> GetSomeData(string param);
void SaveData();
}
public class Service2: IService2
{
private MyContext context;
public Maestri(MyContext context)
{
this.context = context;
}
public void Dispose()
{
context.Dispose();
}
public IEnumerable<SomeDataType2> GetSomeData(string Param)
{
[...]
}
public void SaveData()
{
[...]
context.SaveChanges()
}
}
我注意到,对于每个对Controller/SomeAction的请求,MyContext构造函数只调用了一次,但dispose()将被调用两次。这让我想到了我的一个糟糕的设计。
我已尝试删除上下文。Dispose()来自服务,但这会导致MyContext.dispose永远不会被调用,但会为每个请求生成一个新实例。
有人能指出我做错了什么吗
谢谢 如果在Service1中处理上下文,这似乎很正常,因为ninject也应该处理注册的对象。所以我想你可以从你的服务中删除context.dispose(),但是ninject从不在上下文中调用dispose,其他人应该调用它,我想注入有什么用呢?您如何知道您正在处理的上下文不能被其他服务使用?很明显ninject应该处理他创建的对象。。。如果不是,您应该使用另一个IOC框架:)我完全同意,但是在DbContext Dispose()方法上设置断点,它永远不会被调用。我真的不能认为Ninject“忘记”了上下文;)
kernel.Bind<MyContext>().ToSelf().InRequestScope();
kernel.Bind<IService1>().To<Service1>().InRequestScope();
kernel.Bind<IService2>().To<Service2>().InRequestScope();
public class MyController : Controller
{
private readonly IService1 _service1;
private readonly IService2 _service2;
public MyController(IService1 service1, IService2 service2)
{
_service1 = service1;
_service2 = service2;
}
public ActionResult SomeAction()
{
var data1 = _service1.GetSomeData("");
var data2 = _service2.GetSomeData("");
[...]
return View();
}
}