c# – 为什么不使用存储库返回部分域模型结果
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 为什么不使用存储库返回部分域模型结果,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4059字,纯文字阅读大概需要6分钟。
内容图文
![c# – 为什么不使用存储库返回部分域模型结果](/upload/InfoBanner/zyjiaocheng/811/3be3761a408d455aba39bece15505619.jpg)
我已经看过一些文章说明存储库应该只返回方法调用的完整域模型,例如GetAll().但是,如果我需要的是一个列表,其中每个项目仅由具有30个属性的域模型中的2个属性组成?我想显示列表部门,其中列表仅显示部门名称和位置.用户可以从该列表中选择一个部门并请求其详细信息.从那里我可以进行另一个存储库调用,以返回所选内容的完整域模型,并允许进行典型的crud操作.
但是,如果我不应该使用存储库来返回完整域模型的子集,那么建议的方法是什么?我想我可以返回一个完整的域模型列表,但这似乎是浪费网络带宽,以便通过网络带来如此多的数据,我将不会使用.如果我创建另一个模型来表示感兴趣的2个属性,这似乎是另一个大量的工作要做,因为我拥有的每个模型都有自己的存储库和存储库访问的服务模块.
从存储库中检索完整域模型子集的建议方法是什么?此外,我不知道如果我违反仅拉动完整模型的规则也会发生什么,同时拉动部分模型数据也只会用于选择列表.
解决方法:
在我看来,这可以被认为是一个非常主观的问题….我的建议是基于DDD实践.
在DDD的上下文中,存储库应始终返回域对象(即聚合).聚合是数据存储传输的基本元素 – 您请求加载或保存整个聚合.由应用程序层决定将数据转换为对视图有意义的模型/ DTO.
为了解决您的问题:
>您所描述的选择列表示例是DTO的理想选择.如果创建DTO以表示支持视图的两个属性,则表示您正在创建POCO对象.这个对象重量轻,创建起来很便宜.您可以使用AutoMapper等工具来协助DTO和域模型之间的映射.在更改视图时,您的更改通常与DTO对象及其映射隔离.您尚未通过应用程序层将视图概念泄露到域层.
> DTO将减少请求客户的带宽成本(即,您没有返回具有30个属性的域实体并公开显示您的实体)
>您可以使用单个存储库来支持您的部门选项列表
部门实体的查看和CRUD操作.
>使用一个域模型.但是,创建需要支持该域模型或模型的视图的DTO.
在一天结束时,DDD并不便宜,它不是一颗银弹.
如果你有一个简单的问题要解决,那么使用简单的CRUD和一个对你有意义的模型.这些只是指导方针……
DDD makes sense for developing software of extremely high essential
complexity (with a lot of correlated business rules). And/or software
with clear future, where the Domain Model can outlast the
infrastructure, or where the business requirements change fast. In
other cases DDD may bring more accidental complexity than solve.
对于它的价值,这里有一些关于DDD概念的额外评论,希望有助于:
用例最佳存储库查询:
Vaughn Vernon将模式用例最优存储库查询描述为….
您可能会想要使用所谓的用例最优查询,而不是读取各种类型的多个整个聚合实例,然后以编程方式将它们组合到单个容器(DTO或DPO)中.在这里,您可以使用finder查询方法设计Repository,该方法将自定义对象组合为一个或多个Aggregate实例的超集.查询动态地将结果放入专门设计的值对象(DDD)中,以满足用例的需要.
You design a Value Object and not a DTO because the query is domain
specific, not application specific such(as are DTOS). The custom use
case optimal Value Object is then consumed directly by the view render.
这是使用CQRS的类似方法;但是,存储库正在执行统一域模型存储,而不是旨在支持只读视图的数据库.
沃恩弗农还说:
If you find that you must create many finder methods for supporting
use case optimal queries on multiple repositories, it’s probably a
code smell.
这可能是因为您错误判断了Aggregate边界并忽略了设计一个或多个不同类型的Aggregates的机会.
Vaughn将此代码的气味描述为:存储库掩码聚合错误设计
这也可能表明需要考虑使用CQRS.
DDD查询模型(又称读取模型)
查询模型是非规范化数据模型.它仅用于显示数据,而不是用于提供域行为. Vaughn Vernon说:
If this kind of data model is a SQL database, each table would hold
data for a single kind of client view(display). The table can have
many columns, even a subset of those needed by any given user
interface display view. Table views can be created from tables, each
of which is used as a logical subset of the whole.
他还声明可以根据需要为许多观点提供支持.值得注意的是,基于CQRS的视图既便宜又一次性(用于开发和维护).使用Event Sourcing,可以很好地使用这种方法.
DDD DTO:
一种方法是让您的应用程序层组装DTO. DTO将是您的域实体或实体的子集,以满足您的观点.
Vaughn Vernon简单地说 –
DTO is designed to hold the entire number of attributes that need to
be displayed in a view
DDD存储库
Martin Fowler将Repository模式描述为:
Mediates between the domain and data mapping layers using a
collection-like interface for accessing domain objects.
请参考以下SO问题:
> DDD: Should a Dto Assembler be a part of Domain Layer?
> Should the repository layer return data-transfer-objects (DTO)?
内容总结
以上是互联网集市为您收集整理的c# – 为什么不使用存储库返回部分域模型结果全部内容,希望文章能够帮你解决c# – 为什么不使用存储库返回部分域模型结果所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。