【问题标题】:How to handle DBContext when using Ninject使用 Ninject 时如何处理 DBContext
【发布时间】:2015-04-02 06:27:24
【问题描述】:

我是第一次尝试使用 Ninject 和 OpenAccess。请帮我解决以下问题。这是我的项目的样子...

public class ContentController : Controller
{
    private ContentService contentSvc;

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

以下类位于我的网络应用程序中的一个文件夹下。

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 是否在每个 REQUEST 中配置 DBContext?我得到不同的错误,例如'对象引用未设置为对象的实例。',或'ExecuteReader 需要打开且可用的连接。连接的当前状态是打开的。'

附言

我的 MVC Web 应用程序的文件夹下有 ContentService。 ContentRepository 是一个单独的程序集。我将在 ContentService 中添加业务逻辑,并将“ContentRepository”仅用于 CRUD 操作。另外,请让我知道这种架构是否可行,或者是否有更好的方法来创建服务和存储库。

【问题讨论】:

  • 我非常喜欢将逻辑操作(您的服务)与数据操作(您的存储库)分开。过去它对我来说非常有效。我认为这是一个很棒的模型
  • 谢谢,这让我在试图弄清楚为什么我的 dbcontext 不断崩溃的过程中节省了数周的时间。我还使用了 WithConstructorArgument (inject)... 这应该在某处更清楚地记录!
  • 我在使用 EF 时使用了 kernel.Bind().To()。

标签: asp.net-mvc ninject telerik-open-access


【解决方案1】:

这就是我将如何做你的 Ninject 绑定,

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

在上面的例子中,这种模式应该可以很好地使用 EF 和 Ninject。

【讨论】:

  • @Luke 如果您在 ContentService 中注入 2 个存储库,您将获得 2 个不同的上下文,当两个存储库都转到 2 个不同的表时,您无法提交事务。这个假设对吗?
  • @Elisa 是的,这就是目的
  • @Luke 但是,如果您在每个存储库中有 2 个不同的上下文,则您无法跨两个存储库执行事务。我认为这是一个问题。我建议问题开启者将 IUnitOfWork 注入他的服务,以便服务可以调用 2 个存储库并提交。这将是一个更好的方法,你同意吗?
  • @elisa 的想法是您在两个存储库之间共享 DBContext,如果您有完全独立的 DBContext 并且希望在同一个事务中同时提交,您将需要使用事务范围和 DTC,即相当沉重。鉴于我们谈论的是 Web 应用程序,请求确实是工作单元,因此 IMO 您最好只在请求中涉及的所有存储库之间共享上下文。因此在上面绑定上下文 .InRequestScope()
  • 在单元测试中怎么样?你的绑定会是什么样子?没有 asp.net 或 mvc,但类似的 repo 设置
猜你喜欢
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多