Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用ninject的MVC DBContext管理_C#_Asp.net Mvc_Entity Framework_Ninject_Ninject.web.mvc - Fatal编程技术网

C# 使用ninject的MVC 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 {

我的项目使用MVC5、EF6和Ninject

我有一些组成业务层的服务类,只有它们才允许访问DbContext,这意味着控制器不能直接访问上下文

服务类别如下所示:

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(); 
    }
}