首先,如果您使用的是完整的ORM,例如Entity Framework或NHibernate,则应避免实现存储库和工作单元的附加层。这是因为; ORM本身公开了通用存储库和工作单元。 如果是EF,则您DbContext
是工作单位,并且DbSet
是通用存储库。如果是NHibernate,它ISession
本身就是。 在相同的现有存储库上构建通用存储库的新包装是重复的工作。为什么要重新发明轮子?
除了上述所有以外,通常讨论的另一个问题是“如果我们决定将来更改ORM,该怎么办”。这不是决策时的重点,因为:
考虑到上述四个问题,即使您使用的是完整的ORM,也可能有必要创建存储库-但是, 。
即使在这种情况下,也必须避免使用通用存储库。它被认为是反模式。
我建议你阅读这些(1,2,3,4,5)的文章解释了为什么通用存储库是一个反模式。这等回答论述了一般Repository模式。
因此,我建议:
另外,请勿IQueryable
从具体存储库中返回。这违反了存储库存在的基本目的- 抽象数据访问。通过IQueryable
在存储库外部进行公开,许多数据访问决策都会泄漏到调用代码中,并且存储库失去了对其的控制。
我需要为每个实体创建一个存储库还是为上下文实现一个通用存储库
如上所述,为每个实体创建存储库是更好的方法。请注意,存储库最好返回域模型而不是实体。但这是另一个讨论的话题。
通用存储库可用于EF Database First吗?
如上所述,EF本身公开了通用存储库。在上面再建一层是没有用的。您的图片在说同样的话。