网站建设维护成,lamp和wordpress,wordpress主题解密,个人网站怎么推广1. 引言
单从字面理解#xff0c;不管是领域服务还是应用服务#xff0c;都是服务。而什么是服务#xff1f;从SOA到微服务#xff0c;它们所描述的服务都是一个宽泛的概念#xff0c;我们可以理解为服务是行为的抽象。从前缀来看#xff0c;根据DDD的经典分层架构…1. 引言
单从字面理解不管是领域服务还是应用服务都是服务。而什么是服务从SOA到微服务它们所描述的服务都是一个宽泛的概念我们可以理解为服务是行为的抽象。从前缀来看根据DDD的经典分层架构它们又隶属于不同的层应用服务属于应用层领域服务属于领域层。 应用层Application负责展现层与领域层之间的协调协调业务对象来执行特定的应用程序任务。它不包含业务逻辑。领域层Domain负责表达业务概念业务状态信息以及业务规则是业务软件的核心。
所以综合来看应用服务是用来表述应用行为而领域服务用来表述领域行为。那怎么理解应用行为和领域行为呢应用行为描述了一个具体操作从开始到结束的每一个环节而领域行为是对应用行为的细化用来处理具体的某一个环节。比如我们手机购物从购物车结算这一场景来举例这就是一个应用行为。而这个应用行为又主要包括金额计算、支付、生成订单这些子环节就可以理解为一个领域行为。
我们就不咬文嚼字了下面我们就一一展开。
2. 应用服务
应用服务是用来表达用例和用户故事User Story)的主要手段。
应用层通过应用服务接口来暴露系统的全部功能。在应用服务的实现中它负责编排和转发它将要实现的功能委托给一个或多个领域对象来实现它本身只负责处理业务用例的执行顺序以及结果的拼装。通过这样一种方式它隐藏了领域层的复杂性及其内部实现机制。
应用层相对来说是较“薄”的一层除了定义应用服务之外在该层我们可以进行安全认证权限校验持久化事务控制或者向其他系统发生基于事件的消息通知另外还可以用于创建邮件以发送给客户等。
应用层作为展现层与领域层的桥梁。展现层使用VO视图模型进行界面展示与应用层通过DTO数据传输对象进行数据交互从而达到展现层与DO领域对象解耦的目的。
3.领域服务
领域层就是较“胖”的一层因为它实现了全部业务逻辑并且通过各种校验手段保证业务正确性。而什么是业务逻辑呢业务流程、业务策略、业务规则、完整性约束等。 当领域中的某个操作过程或转换过程不是实体或值对象的职责时我们便应该将该操作放在一个单独的接口中即领域服务。请确保该服务和通用语言时一致的并且保证它是无状态的。 根据这句话我们有几个问题需要理清
什么时候使用领域服务领域服务无状态怎么理解
领域服务是用来协调领域对象完成某个操作用来处理业务逻辑的它本身是一个行为所以是无状态的。状态由领域对象具有状态和行为保存。
上面也说了领域对象是具有状态和行为的。那就是说我们也可以在实体或值对象来处理业务逻辑。那我们该如何取舍呢一般来说在下面的几种情况下我们可以使用领域服务
执行一个显著的业务操作过程对领域对象进行转换以多个领域对象为输入返回一个值对象。
4. 案例分析
我们拿经典的转账问题来分析一下而针对转账这一操作它的业务用例应该是这样的
检查账号余额是否足够检查目标账户账号是否合法转账短信通知转账双方
其中1,2步是转账的合法性校验属于转账业务的一部分所以1,2,3均应该放到领域层通过领域服务来实现。短信通知它并不是是转账的核心业务因为这根据具体情况而定比如只有客户订阅了账号变动通知我才发短信。所以将第4步归类到应用服务中去实现就确保了领域服务的纯粹性。
而至于持久化的问题我们可以这样想领域逻辑应该只关心业务逻辑才能保证领域逻辑的可重用性。将持久化放到应用层我们就会有更多的选择性。
5.总结
当应用服务中的逻辑趋于复杂时我们就要小心领域逻辑泄露到应用服务中去。而在使用领域服务时我们又要避免过度使用因为会导致贫血领域模型。毕竟有些单一的操作更适合放到领域对象实体和值对象中去。
所以总结以下
服务是行为的抽象。应用服务通过委托领域对象和领域服务来表达用例和用户故事。领域对象实体和值对象负责单一操作。领域服务用于协调多个领域对象共同完成某个业务操作。应用服务不处理业务逻辑领域服务处理业务逻辑。 相关文章
DDD理论学习系列1-- 通用语言DDD领域驱动之干货 一DDD理论学习系列2-- 领域DDD理论学习系列3-- 限界上下文DDD理论学习系列4-- 领域模型事件总线知多少2DDD理论学习系列5-- 统一建模语言DDD理论学习系列6-- 实体DDD理论学习系列7-- 值对象从事件和DDD入手来构建微服务DDD领域驱动之干货 一WeText项目一个基于.NET实现的DDD、CQRS与微服务架构的演示案例【DDD/CQRS/微服务架构案例】在Ubuntu 14.04.4 LTS中运行WeText项目的服务端
原文地址http://www.cnblogs.com/sheng-jie/p/7097129.html .NET社区新闻深度好文微信中搜索dotNET跨平台或扫描二维码关注