首页 > 解决方案 > 通过使用两个几乎相同的通用数据库访问类来强制执行 DRY

问题描述

假设我有一个业务逻辑层,我在其中做了一些类似于存储库模式的东西。我的存储库中的每个类都扩展了相同的通用类,其中我有基本的 CRUD 操作。

我遇到了一个问题,我需要为我的数据库中的表编写相同的逻辑,我有一个多对多的关系——我的 ORM 中可能有 5 个位置。

最初,我考虑将这个逻辑放在泛型类中以强制执行 DRY - 但是,这可能是一个非常糟糕的主意,因为我的非多对多表也将能够访问这些特定方法。

另一种方法是将这个逻辑包含在我的每个存储库类中,这意味着我将不得不重复我的代码——我自然不喜欢那样。

因此,这更像是一个设计问题。但我真的很想知道,您如何相信可以解决这个问题,以使我的代码尽可能干净。

标签: c#asp.net-coredesign-patterns

解决方案


一条记录是否用于连接表通常只对查找很重要(因为您需要知道它是主键还是复合键)。

所以,如果你想保持 DRY,你可以使用 Entity Framework 的Find<T>方法。它需要一组键值(对于非连接表只有一个元素)。

参考:https ://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.dbcontext.find

如果您更喜欢使用SingleOrDefault,FirstOrDefault等,只需更改您的方法以获取Expression<Func<T, bool>> predicate参数。然后您的调用者可以指定他们需要如何查找记录。

另一方面,如果您将类型参数放在方法而不是类上,则不必让一堆类扩展同一个类-您可以只拥有一个类。


推荐阅读