0

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

我有 :

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

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

现在假设我有用户存储库:

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

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

任何好主意如何在通用存储库中进行此操作?

4

2 回答 2

1

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

现在,这是一个 Web 应用程序,在这种情况下,您的工作单元将是一个请求。在同一个请求中,重用您的 DBContext。有很多方法可以做到这一点,而且就在我的脑海中——你会想要像“OnActionExecuting”这样的东西来处理你的上下文。

但更好的是使用控制反转模式(有很多框架使用它,我主要使用NInject。这将在需要时自动创建某个类的新实例,具体取决于您建议的范围 -在这种情况下是“onRequestScope”。关于 IoC 的内容还有很多,但不是问题的范围

于 2012-11-08T07:16:07.433 回答
0

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

如果您更喜欢DbContext成员变量,则EFRepository需要实现IDisposableDbContext.Dispose()从其Dispose方法调用。

于 2012-11-05T22:54:56.517 回答