一,ddd中有三种service。分别是application service, domain service, infrastructure service。
①application service
首先从简单的开始讲。application service是应用程序的某个功能的入口(end point)。如果你使用的是分层架构,那它是位于presentation和domain之间。
②infrastructure service
infrastructure service实现不依赖于业务(domain)的功能。简单的例子来讲,比如打印日志(log),发送邮件(如果你的应用软件不是处理邮件问题的话)
infrastructure service位于最底层的infrastructure层。
③domain service
实现domain的service类。三种service中,唯一可以写业务逻辑的地方。
由于ddd提倡充血模型的缘故,我们在建模的时候要尽量避免制造domain service。尽量把业务逻辑放到其他的domain object中(比如entity, value object中)。
二,Service的比较
application service vs domain service
操作层面上如何处理application service和domain service呢?
首先application service既然是入口,在一个模块中,它必定是存在的。与之相反,domain service则不一定需要。
因此,再做类设计时可以先假定domain service不存在。直接写application service,在application service中对其他domain object进行操作。
理想情况下,application service存在的代码基本上就是它调用其他domain object的方法,具体的业务逻辑都会在domain object的方法中。所以当application service中出现if/else之类的语句,或者application service的一个方法变得很长时,我们就该警惕是不是把业务逻辑写到了application service中。这个时候我们该考虑是否需要重构,比如把逻辑放进domain object,或者增加一个domain service。
三,总结:ddd中把service类分成三种。
application service, domain service, infrastructure service。
domain service中可以写业务逻辑,但同时理想情况下我们尽量不实用domain service。
另外,我们要注意不要将业务逻辑写到application service中。