关于ABP——领域服务的思考
我在刚接触ABP的时候一直有一个疑问——有了应用服务,为什么还需要领域服务呢?
领域服务和应用服务对比
| 领域服务 | 应用服务 | |
|---|---|---|
| 返回值 | Entity | DTO |
| 被表现层调用 | 不可以(非强制) | 可以 |
在ABP里面不是强制要使用领域服务的,但使用领域服务是个比较好的实践。
什么时候使用领域服务?
- 处理的是业务,而非场景(use-case)
- 要对Entity的状态修改加限制
举例
栗子 电商的商品扣除库存
假设我们写在应用层
定义以下应用服务:public interface IStockApplication
{
...
bool Reduce(ProductDto product, int qty);
}
public interface IOrderApplication
{
...
void Submit(OrderDto order);
}
可能会造成的问题:
- 扣库存这个业务就会暴露给表现层,造成表现层可能出现直接调用的情况,这是应该避免的。
- 开发Submit方法的技术人员不知道IStockApplication.Reduce,而是直接操作Product实体
解决问题:
将Product实体的Stock属性设置为只读,定义领域服务
public class Product
{
...
//库存
public int Stock{get; protected set;}
//保留库存
public int RetainStock{get;set;}
internal bool Reduce(int qty)
{
//检查库存
if(RetainStock > Stock-qty)
return false;
Stock-=qty;
}
}
public interface IStockDoman
{
...
bool Reduce(ProductDto product, int qty);
}
public class StockDoman:IStockDoman
{
...
bool Reduce(Product product, int qty)
{
...
product.Reduce(qty);
...
return true;
}
}
public interface IOrderApplication
{
...
void Submit(OrderDto order);
}
这样就有效的避免了上述问题
关于ABP——领域服务的思考的更多相关文章
- 基于DDD的.NET开发框架 - ABP领域服务
返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...
- ABP框架 - 领域服务
文档目录 本节内容: 简介 例子 创建一个接口 实现服务 使用应用服务 相关论述 为什么不只用应用服务? 如何强制你使用领域服务? 简介 领域服务(或服务)用来执行领域操作和业务规则.Eric Eva ...
- ABP理论学习之领域服务
返回总目录 本篇目录 介绍 IDomainService接口和DomainService类 样例 创建一个接口 服务实现 调用应用服务 一些讨论 何不只使用应用服务 如何强制使用领域服务 介绍 领域服 ...
- ABP入门系列(18)—— 使用领域服务
ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 1.引言 自上次更新有一个多月了,发现越往下写,越不知如何去写.特别是当遇到DDD中一些概念术语的 ...
- ABP官方文档翻译 3.4 领域服务
领域服务 介绍 IDomainService接口和DomainService类 示例 创建接口 服务实现 使用应用服务 一些探讨 为什么只有应用服务? 如何强制使用领域服务? 介绍 领域服务(或者在D ...
- 初识ABP vNext(11):聚合根、仓储、领域服务、应用服务、Blob存储
Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 聚合根 仓储 领域服务 BLOB存储 应用服务 单元测试 模块引用 最后 前言 在前两节中介绍了ABP模块开发的基本步 ...
- 基于ABP落地领域驱动设计-04.领域服务和应用服务的最佳实践和原则
目录 系列文章 领域服务 应用服务 学习帮助 系列文章 基于ABP落地领域驱动设计-00.目录和前言 基于ABP落地领域驱动设计-01.全景图 基于ABP落地领域驱动设计-02.聚合和聚合根的最佳实践 ...
- ABP(现代ASP.NET样板开发框架)系列之11、ABP领域层——仓储(Repositories)
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之11.ABP领域层——仓储(Repositories) ABP是“ASP.NET Boilerplate Proj ...
- ABP(现代ASP.NET样板开发框架)系列之12、ABP领域层——工作单元(Unit Of work)
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之12.ABP领域层——工作单元(Unit Of work) ABP是“ASP.NET Boilerplate Pr ...
随机推荐
- [译]Java 垃圾回收的监控和分析
说明:这篇文章来翻译来自于Javapapers 的Java Garbage Collection Monitoring and Analysi 在这个系列的Java垃圾回收教程中,我们将看到可用于垃圾 ...
- JQUERY简写案例
源代码: <script ttype="text/javascript"> $(function(){ $(".btn").eq(0).click( ...
- 使用Visual Source Safe 2005 - 初学者系列 - 学习者系列文章
本文介绍微软的Visual Source Safe 2005工具的使用 1. 打开该软件,选择“新建数据库” 2. 显示欢迎页 3.选择路径.这里是服务器上代码存放的目录. 4.这里选择第一项 5 ...
- javascript 学习总结(九)面向对象编程
1.面向对象的工厂方法 function createPerson(name, age, job){ var o = new Object(); o.name = name; o.age = age; ...
- C#编程实践--字符串反转
朴素反转 朴素解法,倒序遍历,字符串拼接,字符串性能低下,在长度已知的前提可以使用char数组代替 public static string NaiveReverse(string text) { s ...
- select省市联动选择城市 asp.net mvc4
本文在 http://www.cnblogs.com/darrenji/p/3606703.html(感谢博主的分享)基础上加入全国各省市,从文件中读取全国省市县,组成省市联动的选择标签 在Model ...
- JavaScript精彩范例(1)——Jquery EasyUI应用的一个框架实例
从网上看到的,非常漂亮,放在这里和大家分享一下,作者是疯狂秀才 这是截图 >>这是下载地址<<
- Bootstrap 布局
bootstrap提供的布局主要有两种,固定布局和流动布局. Bootstrap 固定布局 用法 <body> <div class="container"> ...
- Windows Server 服务器安全配置
Windows Server 服务器安全配置 好吧,我标题党了.我只了解一些基本的安全配置.如果你是大湿,请绕道或者给予我严厉的批评让我进步谢谢. 编辑这篇文章用的编辑器编辑的,当我单击查看的时候发现 ...
- IOS UI 第二篇:基本UI
1.UI书写: 一个小练习图片如下: 代码如下: @implementation AppDelegate{ UIControl *control; UILabel *l ...