Estou tentando criar um aplicativo que tenha um domínio comercial complexo e um requisito para oferecer suporte a uma API REST (não estritamente REST, mas orientada a recursos). Estou com problemas para encontrar uma maneira de expor o modelo de domínio de maneira orientada a recursos.
No DDD, os clientes de um modelo de domínio precisam passar pela camada processual de 'Application Services' para acessar qualquer funcionalidade de negócios, implementada por Entidades e Serviços de Domínio. Por exemplo, há um serviço de aplicativo com dois métodos para atualizar uma entidade de Usuário:
userService.ChangeName(name);
userService.ChangeEmail(email);
A API deste serviço de aplicativo expõe comandos (verbos, procedimentos), não estado.
Mas se também precisamos fornecer uma API RESTful para o mesmo aplicativo, existe um modelo de recursos do usuário, que se parece com isso:
{
name:"name",
email:"email@mail.com"
}
A API orientada a recursos expõe estado , não comandos . Isso levanta as seguintes preocupações:
cada operação de atualização em uma API REST pode mapear para uma ou mais chamadas de procedimento do Serviço de Aplicativo, dependendo de quais propriedades estão sendo atualizadas no gabarito de recursos
cada operação de atualização parece atômica para o cliente da API REST, mas não é implementada dessa maneira. Cada chamada do Serviço de Aplicativo é projetada como uma transação separada. A atualização de um campo em um modelo de recursos pode alterar as regras de validação para outros campos. Portanto, precisamos validar todos os campos do modelo de recursos juntos para garantir que todas as chamadas em potencial do Serviço de Aplicativo sejam válidas antes de começarmos a realizá-las. Validar um conjunto de comandos de uma só vez é muito menos trivial do que executar um de cada vez. Como fazemos isso em um cliente que nem mesmo conhece comandos individuais?
chamar métodos de Serviço de Aplicativo em ordem diferente pode ter um efeito diferente, enquanto a API REST faz parecer que não há diferença (dentro de um recurso)
Eu poderia ter problemas mais semelhantes, mas basicamente todos são causados pela mesma coisa. Após cada chamada para um Serviço de Aplicativo, o estado do sistema é alterado. Regras do que é mudança válida, o conjunto de ações que uma entidade pode executar na próxima mudança. Uma API orientada a recursos tenta fazer com que tudo pareça uma operação atômica. Mas a complexidade de atravessar essa lacuna deve ir a algum lugar, e parece enorme.
Além disso, se a interface do usuário for mais orientada a comandos, o que geralmente ocorre, teremos que mapear entre comandos e recursos no lado do cliente e depois no lado da API.
Questões:
- Toda essa complexidade deve ser tratada por uma camada de mapeamento (espessa) de REST para AppService?
- Ou estou faltando alguma coisa no meu entendimento de DDD / REST?
- O REST poderia simplesmente não ser prático para expor a funcionalidade de modelos de domínio em um certo grau (bastante baixo) de complexidade?