域名和应用程序服务之间的主要区别是什么?(我正在使用NHibernate)
哪个层对业务逻辑更好?什么是最佳做法?
-S#体系结构使用应用程序服务作为"协调层",但不打算解释为什么它不是应该是业务逻辑的域服务.
Jos*_*ris 26
你的里程可能非常,但我会尝试根据我如何使用它们来定义.无论您的持久层如何,我都会将它们定义为实际用途:
域服务 - 用于强制域的完整性并便于从域中插入,创建,删除和检索数据的服务.此外,域服务可以将域对象的更高级别组合编排到视图模型中.通常,这些都是存储库之上的外观,用于隐藏一些低级实现,并提供更符合UL(无处不在的语言)的接口,以帮助管理期望.
应用程序服务 - 特定于域模型实现或不依赖于域模型的服务.一个典型的例子就是根据域中的状态变化或动作发送和发送电子邮件.这通常是应用程序本身的要求,可能不是由域模型指定的.这可以是在调用域服务之后由应用程序服务程序执行,也可以是从域服务引发的事件.
就像我说的,这可能不适合每个人的定义,但这有助于我确保正确的问题进入正确的位置.
至于在哪里放置业务逻辑的更好的地方 - 我实际上认为这很棘手.这种方法有多种业务逻辑.如果存在无法在域中定义的特定于应用程序的逻辑要求,我会将其放在应用程序服务层中.直接影响域的事情,无论应用程序如何,我都会放入域服务层.
问题实际上是花时间来确定什么是真正的"域名关注".例如,除非他的电子邮件地址已知,否则用户可能无法向某个任意应用程序发布评论.你可以说这属于任何一层.关键是真的一致.
我认为@Karsten 在他的评论中引用的帖子比@joseph.ferris 在这里发布的最受好评的答案更真实。
域服务用于“域中的重要过程或转换,它不是实体或值对象的自然责任”(Eric Evans 域驱动设计)。
应用程序服务只是您的应用程序(或其他外部使用者)的某种外观或 API,它们通常对应于一个用例的应用程序,是接口客户端层所需的一组应用程序操作。它们不会包含业务逻辑,也不包含领域专家有一天可能会要求更改的任何内容。它们可能包含事务管理(工作单元)、应用程序验证(验证从数据库检索的对象的状态/保存到数据库的输入)、安全验证和横切关注点,例如日志记录、缓存等,并将域对象编排到视图模型中。当您有多个客户端(例如 Web API 和 MVC)并且用例响应涉及多个事务资源时,它们特别有用(请参阅 Martin Fowler 撰写的企业应用程序架构模式中的“服务层”部分)。
应用程序服务可以包含对存储库的调用以获取填充数据的域对象,然后它们可能会调用域对象或域服务上的某些方法并再次调用存储库以持久化修改后的域对象。它们通常来自域服务的“更广泛”,因为它们包含整个用例。
| 归档时间: |
|
| 查看次数: |
6611 次 |
| 最近记录: |