0

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

选项

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

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

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

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

4

2 回答 2

1

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

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

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

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

于 2021-05-02T07:21:31.077 回答
1

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

如有必要,或为此目的创建逻辑分组的查询服务/类。这在一定程度上取决于我将如何做的 SPROC 的功能。存储库应该只是简单的 CRUD,最多有一个规范来帮助塑造结果。不应将跨越许多实体和/或聚合的更复杂的操作添加到存储库中,而应建模为单独的查询对象或服务。以这种方式更容易遵循 SOLID,尤其是 SRP 和 OCP(和 ISP),因为您不会经常添加到您的 repo 接口/实现。

于 2022-01-21T15:44:43.920 回答