不使用存储库模式,按原样使用 ORM (EF)

2023-12-12

我总是使用存储库模式,但对于我最新的项目,我想看看是否可以完善它的使用以及“工作单元”的实现。我开始挖掘得越多,我开始问自己这个问题:“我真的需要它吗?”

现在这一切都始于 Stackoverflow 上的几条评论,可以追溯到 Ayende Rahien 在他的博客上的帖子,其中有 2 个具体内容,

  • 存储库是新的单例
  • 询问没有存储库的阿延德生活是否值得过

这可能会永远被谈论,这取决于不同的应用程序。我想知道什么

  1. 这种方法适合实体框架项目吗?
  2. 使用这种方法,业务逻辑是否仍在服务层或扩展方法中(如下所述,我知道,扩展方法是使用 NHib 会话)?

使用扩展方法可以轻松完成此操作。干净、简单且可重复使用。

public static IEnumerable GetAll(
    this ISession instance, Expression<Func<T, bool>> where) where T : class
{
    return instance.QueryOver().Where(where).List();
}

使用这种方法和Ninject作为 DI,我需要做Context一个接口并将其注入我的控制器中?


我已经走了很多路,并在不同的项目上创建了许多存储库的实现,并且......我已经放弃并放弃了它,这就是原因。

异常的编码

您是否会针对数据库从一种技术更改为另一种技术的 1% 的可能性进行编码?如果您正在考虑您的企业的未来状态并同意这是一种可能性,那么 a) 他们必须有很多钱来承担迁移到另一种数据库技术的费用,或者 b) 您选择数据库技术是为了好玩或 c) )您决定使用的第一项技术出现了严重错误。

为什么要抛弃丰富的 LINQ 语法?

LINQ 和 EF 的开发是为了让您可以用它来做一些巧妙的事情来读取和遍历对象图。创建和维护一个可以为您提供同样灵活性的存储库是一项艰巨的任务。根据我的经验,每当我创建一个存储库时,我都会ALWAYS将业务逻辑泄漏到存储库层,以提高查询性能和/或减少对数据库的命中次数。

我不想为我必须编写的查询的每个排列创建一个方法。我还不如写存储过程。我不想要GetOrder, GetOrderWithOrderItem, GetOrderWithOrderItemWithOrderActivity, GetOrderByUserId等等...我只想获取主要实体并遍历并包含对象图,如我所愿。

大多数存储库的例子都是废话

除非您正在开发一些非常简单的东西,例如博客或其他东西,否则您的查询永远不会像您在互联网上找到的围绕存储库模式的 90% 的示例那么简单。我怎么强调都不为过!这是必须要在泥沼中爬行才能弄清楚的事情。总会有一个查询破坏您创建的经过深思熟虑的存储库/解决方案,直到那时您才开始怀疑自己,技术债务/侵蚀就开始了。

不要对我进行单元测试,兄弟

但是如果我没有存储库,单元测试怎么办?我将如何嘲笑?很简单,你不会。我们从两个角度来看:

没有存储库 - 您可以模拟DbContext使用一个IDbContext或其他一些技巧,但你实际上是在进行单元测试LINQ 到对象并不是实体的 LINQ因为查询是在运行时确定的...好吧,这不好!所以现在由集成测试来解决这个问题。

使用存储库 - 您现在可以模拟存储库并对中间的层进行单元测试。很棒吧?好吧,不是真的......在上面的情况下,您必须将逻辑泄漏到存储库层以使查询性能更高和/或减少对数据库的命中,您的单元测试如何涵盖这一点?它现在位于 repo 层,您不想测试IQueryable<T>正确的?另外,老实说,您的单元测试不会涵盖 20 行的查询.Where()条款和.Include()是一堆关系,并再次访问数据库来执行所有其他操作,等等,等等,无论如何,因为查询是在运行时生成的。另外,由于您创建了一个存储库来保持上层持久性的无知,如果您现在想要更改数据库技术,那么抱歉,您的单元测试肯定不会保证在运行时得到相同的结果,回到集成测试。所以存储库的整个点看起来很奇怪..

2 cents

当在普通存储过程(批量插入、批量删除、CTE 等)上使用 EF 时,我们已经失去了很多功能和语法,但我也使用 C# 进行编码,因此不必输入二进制。我们使用 EF,因此我们可以使用不同的提供程序,并以一种良好的相关方式处理对象图。某些抽象有用,有些则无用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不使用存储库模式,按原样使用 ORM (EF) 的相关文章

随机推荐

  • 使用 mlflow 提供用于评分的自定义 Python 模型

    我使用带有 mlflow 的 ML 软件生成的 Python 代码来读取数据帧 执行一些表操作并输出数据帧 我能够成功运行代码并将新数据帧保存为工件 但是 我无法使用 log model 记录模型 因为它不是我们训练和拟合的 LR 或分类器
  • 使用WindowManager添加View,但可以按回键

    我使用 WindowManager 添加了一个视图 它正确地显示了我想做的事情 但我有一个问题 这就是问题 返回键按下不会影响 Android 组件 如 Activity 我想要的是我添加的视图可以聚焦 可以单击视图的内部按钮 仅当单击视图
  • 有没有办法在批处理文件中拥有多种字体、文本大小等?

    正如标题所说 我不知道是否有任何可能的方法来做这样的事情 批处理文件中的粗体 斜体 字体 文本大小 以及是否可以在同一文件中使用它们的不同值 这可能是不可能的 但如果是的话 有人可以告诉我怎么做吗 注意 我不想讨论属性或其他什么 我的意思是
  • 创建初始数据库时访问被拒绝 - 如何授予正确的访问权限?

    我正在heroku上使用mysql创建一个新项目 他们有一个名为JawsDB的插件 它为我提供了mysql主机 用户名 密码 更新 我也尝试过使用他们的其他 mysql 插件 ClearDB 并且我有完全相同的问题 我可以像这样连接到数据库
  • 无法为 python 安装 pandas

    我正在尝试为 python 安装 pandas 但我不断收到很长的错误消息 所以我尝试了以下方法 卸载并重新安装 python 版本 3 10 0 通过命令提示符导航到目录来安装 pandas C Users 用户名 AppData Loc
  • 将特定字符串值映射到 matplotlib.pyplot.imshow() 中的特定颜色

    我有一个pandas dataframe看起来像这样 columns 0 1 2 3 4 5 A A A A B B B B B C C D D D E E F F 我想用它来绘制pyplot imshow 指定以下颜色图 color di
  • 如何从 datagridview 创建主详细信息

    这段代码插入数据库 private void btnSave Click object sender EventArgs e byte imageBt null FileStream fstream new FileStream this
  • SQLite 条件插入或替换

    我正在尝试将记录插入或更新到 sqlite 数据库中 并且仅在新值大于旧值时才更新该值 架构是 CREATE table IF NOT EXISTS SearchTable Owner INTEGER PRIMARY KEY Generat
  • 使用 jQuery 进行简单的屏幕抓取

    我一直在考虑使用 jQuery 使用简单的屏幕抓取器的想法 我想知道以下是否可行 我有简单的 HTML 页面 并且正在尝试 如果可能的话 从另一个页面获取所有列表项的内容 如下所示 主页
  • 计算字符串的所有可能的组合,并进行扭曲

    我试图允许用户在文本框中输入文本 并让程序生成所有可能的组合 但最少 3 个字符和最多 6 个字符除外 我不需要像 as 这样无用的单词 a i to 等弄乱了我的数组 我还将根据字典检查每个组合 以确保它是一个真实的单词 我已经完成了字典
  • 计算csv文件中python中的特定出现次数

    我有一个包含 4 列的 csv 文件 标签 用户 质量 Cluster id 使用 python 我想执行以下操作 对于每个 cluster id 从 1 到 500 我想查看每个用户的好标签和坏标签的数量 从质量列获得 有超过6000名用
  • Android studio getSlotFromBufferLocked:未知缓冲区错误

    我想制作一个简单的登录和注册应用程序 以便用户可以创建一个帐户 姓名 用户名 密码 我使用 WAMP 和 MYSQL 数据库来存储帐户 当我在注册表单上填写用户信息并单击 注册 时 出现以下错误 09 14 09 30 39 864 262
  • 是否使用了 static constexpr 变量 odr?

    给出下面的代码是Foo FOO1是否使用 ODR include
  • 使用 Algolia React-instantsearch 和 React-Native

    我正在尝试获取新的 Algolia反应即时搜索使用react native的组件 我一直在关注guide我完全被困住了 基本上 每当我尝试添加我的
  • 可以查看源代码或反编译 XLL Excel 添加

    是否可以在没有原始源代码的情况下查看 XLL Excel 插件的源代码 我猜测这个 XLL 是用 C 编写的 但不确定 IE 可以使用 dotPeek 反编译的 NET DLL 或者可以通过 Developer gt Visual Basi
  • 从 Access 表单调用 SQL Server 函数

    我正在寻找在 Access 前端使用 SQL Server 函数的正确方法 使用它的一种方式相当简单 只需调用函数 使用括号即可 准备就绪 但我一直坚持另一个案子 如果有两个独立的函数 第一个函数用于 编码 第二个函数用于 解码 数据 那会
  • 无法关闭应用程序浏览器窗口

    我可以打开我的窗口 并在其中执行很多操作 例如通过 Linkedin 或 Facebook 登录 但我无法关闭它以返回我的应用程序 1 我尝试捕获事件来跟踪 url 并在 url 包含特定关键字时关闭窗口 但该事件从未被触发 我从来没有任何
  • 使用 Python 的 MSN

    我计划为我运行的游戏创建一个简单的机器人 并将其放在 MSN 上并回答查询 我想使用Python来做到这一点 并用谷歌搜索并发现MSNP 我想 太棒了 和 太棒了 但它似乎已经有 5 年了 奇怪的是 它无法连接到 MSN 因为这些年来他们可
  • Netbeans IDE 中的自动格式化 Javascript

    是否有任何已知的插件或方法可以在 Netbeans IDE 中正确自动格式化 Javascript 编辑 2012 年 9 月 15 日 进一步研究后 我发现 javascript 模块已经被重写 非常需要 您终于可以找到 javascri
  • 不使用存储库模式,按原样使用 ORM (EF)

    我总是使用存储库模式 但对于我最新的项目 我想看看是否可以完善它的使用以及 工作单元 的实现 我开始挖掘得越多 我开始问自己这个问题 我真的需要它吗 现在这一切都始于 Stackoverflow 上的几条评论 可以追溯到 Ayende Ra