ADM是解决诸如微服务之类的分布式服务的好模式。它适合当今许多基于Web的业务案例。
考虑是否有一个Order Domain对象。使用OOP方法,我们可以添加Order.Purchase()Order.Cancel()等。它在桌面应用程序中可以很好地工作,在桌面应用程序中,我们将订单保存在内存中,并对同一个实例执行多项操作。
但是,如果我们有一个分布式系统,并且该程序只处理一件事,即访问一个订单列表并依次购买每个订单,或者获取一个订单列表并依次取消每个订单,那么将两个Method放在同一个对象上将不会感。我们将必须具有两个域或有界上下文:
PurchaseSystemOrder.Purchase()
和
CancelSystemOrder.Cancel();
这些对象唯一共享的是属性的数据结构。
随着您添加越来越多的微服务,您最终获得了数十种订单。将 Order称为Domain对象不再有意义,即使它与所有这些系统正在处理的概念顺序相同。
有一个Anemic模型Order更有意义,该模型仅封装数据并相应地重命名服务:
PurchaseService.Purchase(Order order)
现在,我们可以再次讨论Order,我们可以添加我们认为可以处理的任何新服务,而不会影响其他当前已部署的服务。
Fowler和Co来自整体系统背景,在他们的世界中,ADM方法将意味着在内存中实例化所有这些独立服务并传递和更改OrderDTO的单个应用程序。这比将这些方法置于丰富的Order模型上要糟糕得多。
但是在分布式系统中,有很多程序,每个程序仅需要一个Order方法,并以多个订单运行它,加载每个程序,运行该方法,然后将其丢弃。它只需要一个Service和一个数据对象流。
完全填充一个丰富的模型,担心所有方法的需求和依赖性仅调用一个模型然后几乎立即丢弃该对象是没有意义的。
加上对其中一种方法的更改,将需要更新所有分布式组件,因为它们都依赖于Rich Model的逻辑。
我的代码库中没有空间容纳他们不需要的东西