存储库模式和自定义执行 SQL
Repository pattern and execution of custom SQL
我一直在从事一个实现存储库模式的项目。基本上它具有以下结构:
Domain Objects <-- classes mapping database objects
Repositories implementing the IRepository or IGetOnlyRepository
interface
DTO objects to communicate with the clients
我参与了从数据库生成报告的工作。报告相当复杂,并且依赖于从存储过程或执行动态查询生成的数据。我注意到,到目前为止,为了对报告执行查询,开发人员使用了给定存储库中的方法来对数据库执行查询(使用 NHibernate 的 session.ExecuteQuery 方法)。
但是,执行的查询通常会结合多个表,对我而言,它们不属于存储库。关于我们可以在哪里执行此类查询,您能否建议我一个好的做法?
我的建议是:不要在架构的顶层使用存储库。
制作'Reports'一个模块
您的系统应该分成模块。所以你应该有一个单独的 'Reporting' 模块,你可以在其中直接使用 sql 而不是存储库。您可能还想在报告模块中创建新的 'flat' 模型以提高性能。
如果所有模块都需要使用您的存储库进行数据访问,这就像使用一颗银弹解决不同的问题一样。那是行不通的!
限界上下文
在领域驱动设计中,有一个概念'Bounded Context'。因此,您的报告模块可能是一个单独的限界上下文。不同的限界上下文使用不同的通用语言。不要在整个系统中使用一套模型。
有用的链接
- https://softwareengineering.stackexchange.com/questions/237513/what-in-reference-to-ddd-is-a-bounded-context
- Extensibiliy with DDD: Module Vs Bounded Context in DDD with MEF
我一直在从事一个实现存储库模式的项目。基本上它具有以下结构:
Domain Objects <-- classes mapping database objects
Repositories implementing the IRepository or IGetOnlyRepository interface
DTO objects to communicate with the clients
我参与了从数据库生成报告的工作。报告相当复杂,并且依赖于从存储过程或执行动态查询生成的数据。我注意到,到目前为止,为了对报告执行查询,开发人员使用了给定存储库中的方法来对数据库执行查询(使用 NHibernate 的 session.ExecuteQuery 方法)。
但是,执行的查询通常会结合多个表,对我而言,它们不属于存储库。关于我们可以在哪里执行此类查询,您能否建议我一个好的做法?
我的建议是:不要在架构的顶层使用存储库。
制作'Reports'一个模块
您的系统应该分成模块。所以你应该有一个单独的 'Reporting' 模块,你可以在其中直接使用 sql 而不是存储库。您可能还想在报告模块中创建新的 'flat' 模型以提高性能。
如果所有模块都需要使用您的存储库进行数据访问,这就像使用一颗银弹解决不同的问题一样。那是行不通的!
限界上下文
在领域驱动设计中,有一个概念'Bounded Context'。因此,您的报告模块可能是一个单独的限界上下文。不同的限界上下文使用不同的通用语言。不要在整个系统中使用一套模型。
有用的链接
- https://softwareengineering.stackexchange.com/questions/237513/what-in-reference-to-ddd-is-a-bounded-context
- Extensibiliy with DDD: Module Vs Bounded Context in DDD with MEF