A principal razão para essas fronteiras é a separação de preocupações . O código que acessa o armazenamento de dados deve ter que se preocupar apenas em acessar o armazenamento de dados. Não deve ser responsável por impor regras aos dados. Além disso, a interface do usuário deve ser responsável por atualizar os controles na interface do usuário, obtendo valores da entrada do usuário e convertendo-os em algo que a camada de domínio possa usar e nada mais. Ele deve chamar as operações fornecidas pela camada de domínio para executar as ações necessárias (por exemplo, salve este arquivo). Um serviço da web chamado deve ser responsável pela conversão do meio de transmissão para algo que a camada de domínio possa usar e, em seguida, chamar a camada de domínio (a maioria das ferramentas faz muito desse trabalho para você).
Essa separação, quando implementada corretamente, pode oferecer a você a capacidade de alterar partes do seu código sem afetar outros. Por exemplo, talvez a ordem de classificação de uma coleção de objetos retornada precise ser alterada. Como você sabe que a camada responsável pela manipulação de dados (geralmente a camada da lógica de negócios) lida com essas coisas, é possível identificar facilmente onde o código precisa ser alterado. Além de não precisar modificar como é recuperado do armazenamento de dados ou de qualquer aplicativo que utilize o domínio (a interface do usuário e o serviço da web do meu exemplo acima).
O objetivo final é tornar seu código o mais fácil de manter possível.
Como uma observação lateral, algumas coisas não podem ser colocadas em uma camada específica do domínio (por exemplo, log, validação e autorização). Esses itens são comumente referidos como preocupações transversais e, em alguns casos, podem ser tratados como uma camada que permanece por si só e que todas as outras camadas podem ver e usar.
Pessoalmente, acho que a abordagem em camadas está desatualizada e que a abordagem de serviço é melhor. Você ainda tem a linha gritante desenhada na areia sobre quem faz o quê, mas isso não o força a ser tão hierárquico. Por exemplo, um serviço de pedido de compra, um serviço de cobrança e um serviço de remessa, da perspectiva do aplicativo, todos esses serviços representam seu domínio, e o adiamento da responsabilidade que descrevi acima ainda é válido nesse contexto, ele acabou de ser alterado que seu domínio existe em vários locais, utilizando ainda o conceito de separação de preocupações.