如何使用Ninject时处理的DbContext(How to handle DBContext w

2019-06-17 17:06发布

我试图使用Ninject和OpenAccess的首次。 请帮我用下面的。 这里是我的项目看起来像...

public class ContentController : Controller
{
    private ContentService contentSvc;

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

下面的类是在我的web应用程序的文件夹下。

public class ContentService
{
    private IContentRepository contentRepository;

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

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

下面库属于一个单独的组件。

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

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

以下是Ninject结合样子..

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

如果我在一个时间内获取一个网页一切正常。 我用一个简单的工具“的Xenu”同时获取多个页面。 这是当我通过一次读取多个页面出现错误使用的DbContext。

我不知道如果Ninject在每个请求dosposing中的DbContext? 我得到不同的错误,如“未设置为一个对象的实例对象引用。”,或“ExecuteReader需要一个开放和可用的连接。 该连接的当前状态是开放的。”

PS

我在我的MVC的Web应用程序文件夹下contentService的。 ContentRepository是一个单独的组件。 我会在被contentService的添加业务逻辑和只能使用CRUD操作“ContentRepository”。 另外,请让我知道,如果这个结构是正确的,或者是有没有更好的方式来创建服务和存储库。

Answer 1:

下面是我会怎么做你Ninject绑定,

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

这种模式应的例子做工精细以上EF和Ninject。



文章来源: How to handle DBContext when using Ninject