如何在存储库模式中配置对象上下文

时间:2012-11-05 20:56:49

标签: c# asp.net .net entity-framework-4

我为我的应用程序数据库实现了一个存储库模式。

我有:

public class EFRepository<T>
{
    DbContext // My db context

    public IQureable<T> GetQuery()
    {
        DataContext.CreateQuery(...);
    }
}

现在让我说我有用户存储库:

公共类UserRepository:EFRepository {         public UserGetUserDetails(int userId)         {             GetQuery()。Where(u =&gt; u.Id = userId).First();         } }

我的问题是当我在派生存储库中使用EF存储库时如何释放DbContext。 让我们说:UserRepository: EFRepository,它使用GetQuery然后我必须处理上下文。

如何在通用存储库中创建它?

2 个答案:

答案 0 :(得分:1)

你应该考虑一下unit of work你有什么。 (互联网上有许多其他教程)。我们的想法是保持相同的 dbcontext并在同一工作单元中重用它。这样,实体在需要它们时就已经附加到上下文等。

现在,这是一个Web应用程序,在这种情况下,您的工作单元将是一个请求。在同一请求中,重用您的DBContext。有很多方法可以做到这一点,而且只是在我的头脑中 - 你需要像OnActionExecuting这样的东西来处理你的背景。

但更好的是使用Inversion of Control模式(有许多框架使用它,我主要使用NInject。这将在需要时自动创建某个类的新实例,取决于你建议的范围 - 在这种情况下'onRequestScope'。关于IoC的更多内容,但不是问题的范围

答案 1 :(得分:0)

我过去使用了类似的模式,在我的情况下,我实际上是从DbContext继承而来,IDisposable本身实现了EFRepository。如果您在using块中使用DbContext或从中派生的类,那么您应该没问题。

如果您更喜欢EFRepository成员变量,则IDisposable需要实施DbContext.Dispose()并从Dispose方法调用{{1}}。