Asp.net mvc EntityFramework 4.1代码优先-在存储库之间共享dbContext的正确方法?
我遇到了多个上下文的问题,出现的主要解决方案是在存储库之间共享上下文,但是我还没有找到一个好的例子来说明如何做到这一点 作为参考,我正在使用MVC Web应用程序连接到我的数据层。我希望每个用户请求有一个上下文(假设这是正确的) 谢谢 编辑- 这是我的解决方案,借助BrokenGlass的链接和以下内容: 我基本上实现了工作单元模式和依赖注入。除了使用MVC,我还应该提到Ninject 在给定的存储库构造函数中(有关工作单元模式的详细信息,请参见下面的链接): 在NinjectMVC3类中的我的MVC应用程序中(键是InRequestScope()方法):Asp.net mvc EntityFramework 4.1代码优先-在存储库之间共享dbContext的正确方法?,asp.net-mvc,entity-framework,ninject,entity-framework-4.1,ef-code-first,Asp.net Mvc,Entity Framework,Ninject,Entity Framework 4.1,Ef Code First,我遇到了多个上下文的问题,出现的主要解决方案是在存储库之间共享上下文,但是我还没有找到一个好的例子来说明如何做到这一点 作为参考,我正在使用MVC Web应用程序连接到我的数据层。我希望每个用户请求有一个上下文(假设这是正确的) 谢谢 编辑- 这是我的解决方案,借助BrokenGlass的链接和以下内容: 我基本上实现了工作单元模式和依赖注入。除了使用MVC,我还应该提到Ninject 在给定的存储库构造函数中(有关工作单元模式的详细信息,请参见下面的链接): 在NinjectMVC3类中的我的
私有静态无效注册服务(IKernel内核)
{
kernel.Bind().To().InRequestScope();
kernel.Bind().To();
//...
}
您的存储库层应提供表示单个请求的上下文对象,并使用上下文对象,然后在满足请求所需的所有单个存储库上使用上下文对象
特别是对于HTTP/web应用程序,您可以缓存数据库上下文,其中存储每个HTTP请求的共享数据。还可以查看此类似的SO线程以了解详细信息:我的答案提供了一个存储提供程序的实现,该实现可用于对象上下文的单个实例。您可以以同样的方式使用代码,使用LINQ to SQLDataContext
而不是EFObjectContext
。RepositoryProvider
优于Ninject的好处是RepositoryProvider
实现不绑定到特定的DI框架,并且可以在任何DI框架中配置它自己
此外,您还可以通过使用DataContextFactory
类来管理DataContext
到线程或WebRequest的创建和作用域(例如@BrokenGlass的答案中的HttpContext.Current.Items
),感谢工作单元链接,我没有在我的存储库中实现任何类型的DI,基本上这就是我需要做的。我还使用了Ninject,因此它使答案有点复杂,但最终使解决方案更容易。我将用我的最终解决方案更新我的问题。
public class PersonRepository : IPersonRepository
{
private readonly MyContext _context;
public PersonRepository(IUnitOfWork unitOfWork)
{
if (unitOfWork == null)
throw new ArgumentNullException("unitOfWork");
_context = unitOfWork as MyContext;
}
//...
}
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IUnitOfWork>().To<MyContext>().InRequestScope();
kernel.Bind<IPersonRepository>().To<PersonRepository>();
//...
}