使用Repository模式时如何调用SQL函数/存储过程

问题描述

在将代码转换为使用存储库模式时调用 sql 函数/存储过程的最佳方法是什么?具体来说,我对读取/查询功能感兴趣。

选项

  1. ExecutesqlQuery 添加IRepository
  2. 添加特定于上下文的新存储库接口(即 ILocationRepository)并添加特定于资源的方法
  3. 为所有随机存储过程添加一个特殊的“存储库”,直到它们全部转换完毕
  4. 不要。只需将存储过程转换为代码并将逻辑放在服务层

选项 #4 似乎确实是最好的长期解决方案,但它也需要更多时间,我希望将其推到未来阶段。

哪个选项(以上或其他)是“最好的”?

注意:我的架构基于使用 ardalis/CleanArchitectureardalis/Specification,但我愿意接受所有建议。

解决方法

不要将 STORED PROCEDURES 视为二等公民。通常,避免使用它们,因为它们经常会带走您的域代码并将其隐藏在数据库中,但有时由于性能原因,它们是您唯一的选择。在这种情况下,您应该使用选项 2 并将它们视为一些简单的数据库获取。

选项 1 真的很糟糕,因为您很快就会在不想要的地方(应用程序服务)有大量 SQL,并且会妨碍向其他存储介质的可移植性。

选项 3 是不必要的,存储过程并不比简单的 Entity Framework Core 数据库访问请求差。

选项 4 是您不能总是避免存储过程的原因。有时尝试查询应用程序服务/存储库中的内容会产生非常大的性能问题。那时,并且只有在您应该介入存储过程的时候。