【问题标题】:Entity Framework 4.1 Code First - Proper way to share dbContext between repositories?Entity Framework 4.1 Code First - 在存储库之间共享 dbContext 的正确方法?
【发布时间】:2011-06-19 17:03:46
【问题描述】:

我遇到了多个上下文的问题,出现的主要解决方案是在存储库之间共享上下文,但是我还没有找到一个很好的例子来说明如何做到这一点。

作为参考,我正在使用 MVC Web 应用程序连接到我的数据层。我希望每个用户请求都有一个上下文(假设这是正确的)。

谢谢,

编辑 -

这是我在 BrokenGlass 链接和以下SO Question 的帮助下的解决方案:

我基本上实现了工作单元模式和依赖注入。我应该提到除了使用 MVC 之外,我还在使用 Ninject。

在给定的存储库构造函数中(有关工作单元模式的详细信息,请参阅下面的链接):

public class PersonRepository : IPersonRepository
{
    private readonly MyContext _context;

    public PersonRepository(IUnitOfWork unitOfWork) 
    {
        if (unitOfWork == null)
            throw new ArgumentNullException("unitOfWork");

        _context = unitOfWork as MyContext;
    } 

    //...
}

在我的 MVC 应用程序中的 NinjectMVC3 类中(键是 InRequestScope() 方法):

private static void RegisterServices(IKernel kernel)
{
     kernel.Bind<IUnitOfWork>().To<MyContext>().InRequestScope();
     kernel.Bind<IPersonRepository>().To<PersonRepository>();
     //...
}  

【问题讨论】:

    标签: asp.net-mvc entity-framework ninject entity-framework-4.1 ef-code-first


    【解决方案1】:

    您的存储库层应提供一个unit of work,它表示单个请求并使用上下文对象,然后在满足请求所需的所有单个存储库上使用该对象。

    对于 HTTP / web 应用程序,您可以将 db 上下文缓存在 HttpContext.Current.Items 中,它存储每个 HTTP 请求的共享数据。另请查看此类似的 SO 线程以获取详细信息:attaching linq to sql datacontext to httpcontext in business layer

    【讨论】:

    • 感谢 Unit of Work 链接,我没有在我的存储库中实现任何类型的 DI,基本上这就是我需要做的。我也在使用 Ninject,所以答案有点复杂,但最终使解决方案更容易。我会用我的最终解决方案更新我的问题。
    【解决方案2】:

    我对@9​​87654321@ 的回答提供了RepositoryProvider 的实现,它与ObjectContext 的单个实例一起工作。您可以以相同的方式使用代码,使用 LINQ-to-SQL DataContext 而不是 EF ObjectContextRepositoryProvider 相对于 Ninject 的优势在于,RepositoryProvider 实现不绑定到特定的 DI 框架,它本身可以在任何 DI 框架中进行配置。

    此外,您可以通过使用 here 中的 DataContextFactory 类来管理 DataContext 的创建和作用域到 Thread 或 WebRequest(例如在 @BrokenGlass 对 HttpContext.Current.Items 的回答中)

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 2012-05-15
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多