How to handle DBContext when using Ninject

青春壹個敷衍的年華 提交于 2019-11-26 11:09:32

问题


I am trying to use Ninject and OpenAccess for the first time. Please help me with the following. Here is what my project looks like...

public class ContentController : Controller
{
    private ContentService contentSvc;

    public ContentController(ContentService contentSvc)
    {
        this.contentSvc = contentSvc;
    }
}

The following class is under a folder in my web app.

public class ContentService
{
    private IContentRepository contentRepository;

    public ContentService(IContentRepository contentRepository)
    {
        this.contentRepository = contentRepository;
    }

    public void InsertContent(Content content)
    {
         contentRepository.InsertContent(content);
    }
}

The following repository belongs to a separate assembly.

public class ContentRepository : IContentRepository
{
    DBContext db;
    public ContentRepository(DBContext _db)
    {
        db = _db;
    }

    public void InsertContent(Content content)
    {
             db.Add(content);
    }
}   

Here is what Ninject binding look like..

kernel.Bind<ContentService>().To<ContentService>().InRequestScope();
kernel.Bind<IContentRepository>().To<ContentRepository>().InRequestScope().WithConstructorArgument(\"_db\", new DBContext());

Everything works fine if I fetch one page at a time. I am using a simple tool \'XENU\' to fetch multiple pages simultaneously. This is when I get errors with DBContext by fetching multiple pages at a time.

I am not sure if Ninject is dosposing the DBContext in each REQUEST?? I get different errors, e.g. \'Object reference not set to an instance of an object.\', OR \'ExecuteReader requires an open and available Connection. The connection\'s current state is open.\'

P.S.

I have ContentService under a folder in my MVC web app. ContentRepository is a separate assembly. I will be adding business logic in ContentService and use \'ContentRepository\' only for CRUD operations. Also, please let me know if this architecture is okay or is there a better way to create services and repositories.


回答1:


Here's how I would do your Ninject bindings,

kernel.Bind<DBContext>().ToSelf().InRequestScope();
kernel.Bind<ContentService>().ToSelf().InRequestScope();
kernel.Bind<IContentRepository>().To<ContentRepository>().InRequestScope();

This pattern should work fine in the example above with EF and Ninject.



来源:https://stackoverflow.com/questions/11921883/how-to-handle-dbcontext-when-using-ninject

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!