【问题标题】:MVC sharing DbContext between repositoriesMVC 在存储库之间共享 DbContext
【发布时间】:2014-03-11 09:44:50
【问题描述】:

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

我采用了多层设计,即 Web、BLL、DAL。

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

接下来研究如何在 DAL 存储库之间共享 DbContext 导致我阅读了大量有关设计模式的内容,最后我学习了 Generic Repository 和 Unit of Work(并快速了解了 Dependency Injection)。

我很快就发现了 Generic Repositoy 和 UoW 的好处。这对于适合 CRUD 功能的 Student、Department、Course... 实体非常有用。我还没有编码。

但在使用通用存储库和 UoW 进行搜索和审核时,它不适合。背景:为什么在 Search 和 Audit 之间共享 DbContext?我想审核同一事务中的每个搜索。

所以我被卡住了!主要是因为搜索功能是只读的,没有提交。其次,搜索和审计实体都非常不同——彼此不同,而且不像 CRUD。因此,据我所知,通用存储库不适用于这两个实体。

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

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

【问题讨论】:

  • 这个SO answer 可能会帮助你。
  • 嗨,Max,感谢您的回答,但这并不能回答我的问题。就像许多其他存储库和 UoW 答案一样,它们迎合了坚持 CRUD 的实体。如上所述,我的搜索和审核实体与此类型非常不同。场景。
  • 我提到的链接是关于试图帮助您回答您用粗体提出的问题有没有办法在两个非常不同的实体之间共享 DbContext。但我知道这个问题并没有总结你在这里倾倒的所有想法和担忧:-) 请记住,通用存储库不是灵丹妙药。您还应该问自己是否需要在完全相同的事务中进行搜索和审计,这意味着如果其中一个失败,所有工作单元都会回滚......
  • 是的,关于通用存储库的好点,谢谢。我一直在这里质疑通用存储库的使用。

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


【解决方案1】:

通用存储库的缺点是并非所有实体都支持 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);
    {
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多