首页 新闻 搜索 专区 学院

各位大佬,应用服务和领域服务该怎么区分才是合理?

0
悬赏园豆:50 [待解决问题]

大佬们,小的学DDD写的一个小DEMO


一个系统有三个简单功能,注册,登录,修改密码.

  • 登录验证:用户密码比对,登录成功后设置Session之类的环境变量.然后返回.
  • 注册 判断用户名是否重复,然后新建一个用户(ID根据最大用户ID值加一)
  • 修改密码 根据旧密码验证,之后修改成新密码(可能需要新密码的验证逻辑)

然后就是区分的时候的思考:

  • 登录验证 都是做的用户的外的行为,全部写在应用服务上没问题,Session之类的考虑使用接口,把实现放在基础设施上.
  • 注册 这里有一步是新建一个用户,这里用到一个规则(ID根据最大用户ID值加一),并且这个操作是会构造一个用户实体的,感觉放在应用层不对劲.但是硬要说这也不能算是一个业务逻辑.不知道该放在哪里.
  • 修改密码 我把旧密码验证写在应用服务里了,而修改密码做成一个行为放在了用户实体上.这样不知道会不会有点小题大做.

最纠结的地方还是注册那里.其他地方的决定也不知道是不是对的.感觉自己只能模棱两可的描述用例流程.完全没办法正确区分领域层和应用层.只能找文章和书来对照,遇到资料没包含的部分就难以下手.真正的项目里面比这个更复杂,更难区分.感觉DDD很虚无.

hesobaro的主页 hesobaro | 初学一级 | 园豆:152
提问于:2020-12-16 18:57
< >
分享
所有回答(2)
0

分层设计以及每一层的功能:
用户界面层:负责向用户显示和解释用户指令。这里指的用户可以是另一个计算机系统,不一定是使用用户界面的人(比如外部应用调用对应接口)。
网关层: 负责提供对外的HTTP服务或者其他应用层协议(这里是指OSI七层协议中的应用层,别混淆了哈)服务。
应用服务层:定义软件要完成的任务,并且指挥表达领域概念的对象来解决问题。这一层所负责的工作对业务来说意义重大,也是与其他系统的应用层进行交互的必要渠道。应用层要尽量简单,不包含业务规则或者知识,而只为下一层中的领域对象协调任务,分配工作,使他们互相协作。它没有反应业务情况的状态,但是却可以具有另外一种状态,为用户或者程序显示某个任务的进度。
领域服务层:负责表达业务概念,业务状态信息以及业务规则。尽管保存业务状态的技术细节是由基础设施层实现的,但是反应业务情况的状态是由本层控制并且使用的。领域层是业务软件的核心。
基础设施层:为上面各层提供通用的技术能力,为应用层传递消息,为领域层提供持久化机制,为用户界面层绘制屏幕组件(PS:这个在互联网应用中几乎用不到)等等。互联网Web应用系统中基础设施包含了数据持久化服务,中间件服务(数据库,Redis,Memcached,zookeeper,ELK等等)以及第三方服务等。
各层除了实现自己的功能外,还需要遵守以下原则:

每一层设计保持内聚,并且只依赖于它的下方的层。
下层向上层发起的通信只能通过中间件等间接方式进行。[2]
上层和下层只能有松散耦合(各自为独立个体,通过简单引用关联)。在某些微服务框架比如Dubbo中,可以把api包提供给上层引用即可。而Spring Cloud的上下层耦合更为松散,通过契约约定即可。前者的优点是调用者可以直接使用提供方定义好的契约和方法。后者的优点则在于最大限度的降低了耦合,避免在上层无限制的进行下层包引入。

是依米呀 | 园豆:241 (菜鸟二级) | 2020-12-17 09:27
1

领域的边界很难确定,是因为你对业务不精通,DDD本来就是专门给那些业务专家人用来建模的,刚开始不会区分很正常,,等你有了足够多的项目积累你也就会慢慢区分了,而且一千个人心中有一千个哈姆雷特,每个人区分,肯定都不相同,不能说谁对谁错,应该是谁的最合适

就拿你举得这个例子,注册只是一个动作,根本不能作为一个领域,他只是领域里的一个操作,因为注册,才会增加用户
在我看来,用户可以作为一个领域

不知道风往哪儿吹 | 园豆:1986 (小虾三级) | 2020-12-17 10:13

谢谢大佬,我想知道的是,为什么这里增加一个领域对象的规则不能算是领域层的东西?

支持(0) 反对(0) hesobaro | 园豆:152 (初学一级) | 2020-12-17 13:55

@hesobaro: 领域对象你可以理解为一个功能模块,它里面有实体对象,有值对象,有仓储,他是一个相对独立的功能模块,用户作为一个领域,他有增加用户,删除用户,修改用户信息,这些都是用户作为领域对象的一系列操作事件,用户表只是用户领域的实体对象

支持(0) 反对(0) 不知道风往哪儿吹 | 园豆:1986 (小虾三级) | 2020-12-17 14:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册