O ADM é um bom padrão para uma solução de serviços distribuídos, como microsserviços. Ele se encaixa em muitos dos casos de negócios baseados na Web de hoje.
Considere se temos um objeto Domínio do Pedido. Com uma abordagem OOP, adicionaríamos Order.Purchase () Order.Cancel () etc. Funcionaria bem em um aplicativo de desktop, onde mantemos pedidos na memória e fazemos várias coisas na mesma instância.
Mas se tivermos um sistema distribuído, com programas que apenas uma coisa, ou seja, acessar uma lista de pedidos e comprar cada um por vez, ou obter uma lista de pedidos e cancelar cada um por vez, ter os dois Métodos no mesmo objeto não fará com que sentido. Teríamos que ter dois domínios ou contextos vinculados:
PurchaseSystemOrder.Purchase()
e
CancelSystemOrder.Cancel();
A única coisa que esses objetos compartilhariam seria a estrutura de dados das propriedades.
À medida que você adiciona mais e mais microsserviços, você acaba com dezenas de tipos de pedidos. Não faz mais sentido falar sobre uma Ordem como um objeto de Domínio, mesmo que seja a mesma ordem conceitual que está sendo processada por todos esses sistemas.
Faz muito mais sentido ter um modelo anêmico, Order, que apenas encapsula apenas os dados e renomeia seus serviços de acordo:
PurchaseService.Purchase(Order order)
Agora podemos falar sobre o Order novamente e podemos adicionar quaisquer novos serviços que pensamos em processar, sem afetar os outros serviços atualmente implantados.
Fowler e Co vêm de um sistema monolítico, em seu mundo uma abordagem ADM significaria um único aplicativo com todos esses serviços separados instanciados na memória e o OrderDTO sendo repassado e mutado. Isso seria muito pior do que colocar os métodos em um modelo rico de pedidos.
Porém, em um sistema distribuído, existem muitos programas, cada um requer apenas um método Order e o executa em vários pedidos, carregando cada um, executando o método e depois descartando-o. Requer apenas um único serviço e um fluxo de objetos de dados.
Preencher um modelo completo por completo, preocupar-se com os requisitos e dependências de todos os Métodos apenas para chamar um único e depois descartar o objeto quase imediatamente é inútil.
Além disso, uma alteração em um único método exigiria a atualização de todos os componentes distribuídos, pois todos eles dependem do Modelo Rico para sua lógica.
Não tenho espaço na (s) minha (s) base (s) de código para itens que não precisam