MVC在存储库之间共享DbContext

时间:2014-03-11 09:44:50

标签: asp.net-mvc entity-framework repository-pattern unit-of-work

我正在开发课程,系,学生MVC应用程序,作为学习MVC的一部分。

我选择了多层设计,即Web,BLL,DAL。

我的DAL有DbContext和许多存储库。例如。学生,系,课程,搜索,审核......

接下来看看我如何在DAL存储库中共享DbContext让我在设计模式上读了很多,最后我在Generic Repository和Unit of Work(以及快速查看依赖注入)。

我很快发现了Generic Repositoy和UoW的好处。这适用于学生,部门,课程......适合CRUD功能的实体。我还没编码。

但是当使用Generic Repository和UoW进行搜索和审核时,它就不合适了。背景:为什么在搜索和审计之间共享DbContext?我想在同一笔交易中审核每次搜索。

所以我被卡住了!主要是因为搜索功能是只读的,没有提交。其次,搜索和审计实体都是非常不同的 - 彼此不同,而不是类似CRUD。因此,就我所见,通用存储库在这两个实体中效果不佳。

有没有办法在两个非常不同的实体之间共享DbContext,例如搜索和审核?

我能想出的最佳方法是将审计功能放在Search DAL存储库中。我不喜欢混合这两个实体,听起来有些难看,但我想我可以做出异常,因为它是审计功能。

1 个答案:

答案 0 :(得分:1)

Generic Repository的缺点是并非所有实体都支持CRUD操作。存储库不必是CRUD。您可以创建特定于实体的存储库,如下所示。

public class Search
{
    public Search(DbContext dbContext);
}

public class AuditRepository
{
    public AuditRepository(DbContext dbContext);
}

由于以下原因,许多开发人员不喜欢通用(CRUD)存储库:

  

“不是每个实体都可以删除,不是每个实体都可以添加,不是每个实体都有一个存储库”   Source

示例是仅具有GetById的存储库。禁止创建/更新/删除的要求。

public class UserRepository
{
    public User GetById(int id);
    {
    }
}