c# - 通过使用两个几乎相同的通用数据库访问类来强制执行 DRY
问题描述
假设我有一个业务逻辑层,我在其中做了一些类似于存储库模式的东西。我的存储库中的每个类都扩展了相同的通用类,其中我有基本的 CRUD 操作。
我遇到了一个问题,我需要为我的数据库中的表编写相同的逻辑,我有一个多对多的关系——我的 ORM 中可能有 5 个位置。
最初,我考虑将这个逻辑放在泛型类中以强制执行 DRY - 但是,这可能是一个非常糟糕的主意,因为我的非多对多表也将能够访问这些特定方法。
另一种方法是将这个逻辑包含在我的每个存储库类中,这意味着我将不得不重复我的代码——我自然不喜欢那样。
因此,这更像是一个设计问题。但我真的很想知道,您如何相信可以解决这个问题,以使我的代码尽可能干净。
解决方案
一条记录是否用于连接表通常只对查找很重要(因为您需要知道它是主键还是复合键)。
所以,如果你想保持 DRY,你可以使用 Entity Framework 的Find<T>
方法。它需要一组键值(对于非连接表只有一个元素)。
参考:https ://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.dbcontext.find
如果您更喜欢使用SingleOrDefault
,FirstOrDefault
等,只需更改您的方法以获取Expression<Func<T, bool>> predicate
参数。然后您的调用者可以指定他们需要如何查找记录。
另一方面,如果您将类型参数放在方法而不是类上,则不必让一堆类扩展同一个类-您可以只拥有一个类。
推荐阅读
- python - Django重定向到错误的视图
- android - 实现 ValueEventListener 的问题
- oracle - PL/SQL 继承实现,其中过程在子对象下实现
- vue.js - 为什么 keyup 不适用于 vue.js 中的字母表
- java - 通过 POST 调用确保 REST
- python - 使用带有 Gunicorn 的烧瓶访问网络外的 IOT 树莓派
- php - 如何在 GCP 上使用 .htaccess 文件重写 .php?
- amazon-web-services - 在 Laravel 中使用 AWS SQS 和 Lambda 进行队列作业
- javascript - 如何在 html 中转换 github 表情符号?
- php - 使用php从每个具有相同名称的选择多个中获取值