我遇到了多个上下文的问题,并且出现的主要解决方案是在存储库之间共享上下文但是我没有找到关于如何执行此操作的良好示例。
供参考,我正在使用MVC Web App连接到我的数据层。我希望每个用户请求有一个上下文(假设这是正确的)。
谢谢,
编辑 -
这是我在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;
}
//...
}
在我的NinjectMVC3类的MVC应用程序中(关键是InRequestScope()方法):
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IUnitOfWork>().To<MyContext>().InRequestScope();
kernel.Bind<IPersonRepository>().To<PersonRepository>();
//...
}
答案 0 :(得分:4)
您的存储库层应提供代表单个请求的unit of work,并使用上下文对象,然后在完成请求所需的所有单个存储库上使用该对象。
对于HTTP / Web应用程序,您可以在HttpContext.Current.Items
中缓存db上下文,该上下文存储每个HTTP请求的共享数据。有关详细信息,请查看此类似的SO主题:attaching linq to sql datacontext to httpcontext in business layer
答案 1 :(得分:0)
我对C#/EF and the Repository Pattern: Where to put the ObjectContext in a solution with multiple repositories?的回答提供了RepositoryProvider
的实现,该实现适用于ObjectContext
的单个实例。您可以使用相同的方式使用代码,使用LINQ-to-SQL DataContext
而不是EF ObjectContext
。 RepositoryProvider
优于Ninject的好处是RepositoryProvider
实现不绑定到特定的DI框架,并且本身可以在任何DI框架中配置。
此外,您可以使用DataContext
类来管理HttpContext.Current.Items
到线程或WebRequest的创建和范围设置(例如@ BrokenGlass对DataContextFactory
的回答)的 here 强>