我努力在.net解决方案中使用DDD实现一项要求。我会尽量减少细节:如何实现DDD存储库来处理具有多个实体的查询?
实体:
- 类别(UID,名称)
- 属性(UID,名称,AttributeValues [])
- 的AttributeValue(UID,名称,ParentAttributeUId )
- 过程(UID,名称,AttributeValues [],分类[])
数据模型:
- 每个进程可以有多个类别(例如, ProcessCategoryMap表)
- 每个过程可以有多个AttributeValues(例如ProcessAttributeValue表)
- 类别之间没有关系,属性,attributeValues
我有S.P. FetchByCategoryAndAttributeValues(类别ID,AttributeValueIds []) 返回一个数据集:
- 匹配类别ID过程的列表中,而且可用AttributeValueIds细化搜索AttributeValues的
- 列表。
如何实现存储库加上调用SP的方法,当返回多个实体时,在我看来,返回的对象是一个值对象,它似乎不在现有实体存储库中引用?
什么想法?
问候,
佩德罗
====编辑:2011/03/30下午2时52 UTC ====
我更新我的问题,珍惜所有的意见加上帮助其他人面临类似的挑战。
@Justice:
解决方案:使用ORM例如NHibernate加上使用ORM的所有理由
我不记得任何在Eric Evans ddd书中提到的ORM。具体的持久性技术如何选择呢?一旦你清理了域名,你就可以随心所欲地坚持下去。 Offcourse我知道NH可以提供帮助并且是强大的工具,但它本身不是解决方案。
@Dominic/@Justice:
解决方案:从存储过程的移开。
首先,对于我来说很难证明当我看到好的T-SQL存储过程时,我不是在谈论CRUD或简单的T-SQL查询。我提到的SP运行几个TSQL CTE,结合不同表中的度量数据来计算权重,使用临时表并返回客观结果:进程列表,类别列表,属性值列表。对SP进行优化和调整为特定的SQL数据库/服务器可能是一个MSFT,Oracle等我不相信那些转移到计算应用端,然后在ORM依赖将有助于执行时间加上所有回并转发查询。对于我来说,在服务器中完成所有这些工作并仅引入过滤数据有很大的区别。我可能是错的。
@All: 我已经确定了真正的问题(如Domenic指出了与ayende链接)我正在将一种基于数据中心方法的解决方案移植到域模型方法中。让我们把它放回去,由SP返回的计算会影响不同的模型。由于数据在数据库中的存在方式,常见的计算和计算在实体之间是有界的,所以问题在于如何实现DDD实现时如何获得最佳效果。以及如何保持数据库管理员的工作:)
您可以创建一个非常好的域模型,坚持数据跨越N个不同的表,问题是当您查询该数据如何使模型,并保持DDD处于良好的立场。
谢谢大家,我还在寻找创意,答案等:)
问候, 佩德罗
刚刚看到您的更新。是的,保持DBA的工作是我们在最后一个地方努力奋斗的事情:P – Domenic 2011-04-17 05:42:39