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

How to call SQL functions / stored procedure when using the Repository pattern

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

选项

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

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

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

注意:我的架构基于 ardalis/CleanArchitecture using ardalis/Specification,尽管我愿意接受所有建议。

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

选项 1 真的很糟糕,因为您很快就会在不需要的地方(应用程序服务)拥有大量的 SQL,这会阻止移植到另一个存储介质。

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

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

https://github.com/ardalis/CleanArchitecture/issues/291

If necessary, or create logically grouped Query services/classes for that purpose. It depends a bit on the functionality of the SPROC how I would do it. Repositories should be just simple CRUD, at most with a specification to help shape the result. More complex operations that span many entities and/or aggregates should not be added to repositories but modeled as separate Query objects or services. Makes it easier to follow SOLID that way, especially SRP and OCP (and ISP) since you're not constantly adding to your repo interfaces/implementations.