问题描述
在将代码转换为使用存储库模式时调用 sql 函数/存储过程的最佳方法是什么?具体来说,我对读取/查询功能感兴趣。
选项
- 将
ExecutesqlQuery
添加到IRepository
- 添加特定于上下文的新存储库接口(即
ILocationRepository
)并添加特定于资源的方法 - 为所有随机存储过程添加一个特殊的“存储库”,直到它们全部转换完毕
- 不要。只需将存储过程转换为代码并将逻辑放在服务层
选项 #4 似乎确实是最好的长期解决方案,但它也需要更多时间,我希望将其推到未来阶段。
哪个选项(以上或其他)是“最好的”?
注意:我的架构基于使用 ardalis/CleanArchitecture 的 ardalis/Specification,但我愿意接受所有建议。
解决方法
不要将 STORED PROCEDURES 视为二等公民。通常,避免使用它们,因为它们经常会带走您的域代码并将其隐藏在数据库中,但有时由于性能原因,它们是您唯一的选择。在这种情况下,您应该使用选项 2 并将它们视为一些简单的数据库获取。
选项 1 真的很糟糕,因为您很快就会在不想要的地方(应用程序服务)有大量 SQL,并且会妨碍向其他存储介质的可移植性。
选项 3 是不必要的,存储过程并不比简单的 Entity Framework Core 数据库访问请求差。
选项 4 是您不能总是避免存储过程的原因。有时尝试查询应用程序服务/存储库中的内容会产生非常大的性能问题。那时,并且只有在您应该介入存储过程的时候。