DDD战术落地—聚合的编排一定要在应用层吗?(领域服务与领域对象的区别)

先说结论:我个人认为不是的。

悖论

网上很多文章给出的结论:

  1. 推荐聚合划分越细越好;
  2. 聚合之间的编排应该放在应用层完成;

但是这就出现了一个悖论,即一些核心的领域逻辑分在了两个聚合中,但是却只能在应用层去组合。造成了领域能力的外泄。

举例

举个“登录操作”例子:

登录时,有“租户”和“用户名/密码”。用户登录时,首先判断是否在某个租户下,然后在判断该租户下用户名/密码是否相同。

因为可以增删改租户信息,也可以增删改用户信息,所以租户和用户应该划分为两个聚合。

领域建模图.png

那么登录这一个行为:具体到代码就会变成了:

boolean authentic=false
//获取租户
Tenant tenant= TenantRepo.tenantOfId(aTenantId);
if(tenant!=null && tenant.isActive()){
    User user=UserRepo.userWithUserName(aTenantId,aUserName);
    if(user!=null){
        authentic=user.isAuthentic(aPassword);
    }
}

但是仔细想下,这个行为应该属于“认证授权”的行为,需要放在应用层进行编排处理吗?它会使得调用者的逻辑非常复杂。强加在客户端上的职责应该在我们的领域模型中予以解决。只与领域相关的信息决不能泄露到客户端。即使客户端是一个应用服务,它也不应该负责身份与访问权限的管理。

客户端(应用层)需要处理的唯一业务职责:调用单个业务操作,而由改业务操作去处理所有的业务细节。

解决方案:提供领域服务

提供一个领域服务,来聚合多个领域对象。

UserDescriptor userDescriptor=authenticationDomainService.authenticate(aTenantId,aUserName,aPassword);

客户端只需要获取一个无状态的AuthenticationDomainService,然后调用authenticate,这种方式将所有的认证细节放在领域服务,而非应用服务。在需要的情况下,领域服务可使用任何领域对象完成操作,包括对密码的加密。

客户端无需知道任何的细节。

通用语言也得到了满足,因为我们将所有的领域术语都放在了身份管理这个领域,而非一部分放在领域模型,另一部分放在客户端(应用层)。

领域服务方法返回了一个UserDescriptor值对象,这是一个很小的对象,并且是安全的,与User相比,它值包含了3个关键属性。

public class UserDescriptor{
  private String emailAddress;
  private long tenantId;
  private String userName;
}

进阶:何时应该使用领域服务

领域服务到底是什么?当领域中某个操作或者转换过程不是实体或者值对象的职责时,此时便应该将该操作放在一个单独的接口,即领域服务。

请保证领域服务和通用语言是一致的,并且保证它是无状态的;

通常领域模型主要关注特定某个领域的业务,同样,领域服务也具有相似特点。由于领域服务有可能在单个原子操作中处理多个领域对象,这将增加领域服务的复杂性。

那么何时一个操作不属于实体或值对象?即何时可使用领域服务:

  • 执行一个显著的业务操作过程;
  • 对领域对象进行转换;
  • 以多个领域对象作为输入进行计算,产生一个值对象结果;

当一个方法不便放在实体或者值对象,使用领域服务便是最佳的解决方案。

领域服务与应用服务的区别

  • 应用服务并不处理业务逻辑;
  • 领域服务恰恰是处理业务逻辑;

缺点:确定需要领域服务

过度使用领域服务将导致贫血领域模型,即所有的业务逻辑都位于领域服务中,而非实体和值对象。

文章参考

DDD领域驱动设计实战(六)-领域服务

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352