Existem muitos fatores que levam à decisão de criar uma camada de serviço. Eu criei camadas de serviço no passado pelos seguintes motivos.
- Código que precisa ser reutilizado por vários clientes.
- Bibliotecas de terceiros para as quais temos licenças limitadas.
- Terceiros que precisam de um ponto de integração em nosso sistema.
- Centralizando a lógica de negócios duplicada.
Caso 1: Você está criando uma funcionalidade básica que precisa ser usada por uma infinidade de clientes diferentes. A camada de serviço se baseia na funcionalidade de diferentes clientes para acessar a funcionalidade fornecida imediatamente.
Caso 2: você normalmente hospeda o código no espaço do aplicativo, mas está usando uma biblioteca de terceiros para as quais possui licenças limitadas. Nesse caso, você tem um recurso que gostaria de usar em qualquer lugar, mas apenas um número limitado deles. Se você hospedá-lo atrás de um serviço, toda a organização poderá utilizá-lo em seus aplicativos sem precisar comprar uma licença para cada hospedagem individual.
Caso 3: você está criando funcionalidade para terceiros se comunicarem com você. No seu exemplo, você pode configurar um ponto de extremidade de inventário para permitir que os fornecedores passem mensagens para você sobre remessas de produtos recebidas.
Caso 4: você analisou seu código em toda a empresa e descobriu que equipes separadas criaram a mesma coisa (apenas implementadas de maneira um pouco diferente). Com uma camada de serviço, você pode escolher as melhores abordagens e agora pode implementar o processo da mesma forma em todas as equipes, solicitando que elas entrem no serviço. Outro benefício para centralizar a lógica é quando erros são encontrados. Agora você pode implantar a correção uma vez e todos os clientes desfrutam do benefício ao mesmo tempo.
Tudo isso dito, existem potenciais negativos para uma camada de serviço.
- Adiciona complexidade do sistema. Onde antes você tinha apenas um aplicativo para depuração, agora você tem dois. Os problemas de produção exigem a verificação das configurações do aplicativo cliente, do aplicativo de serviço ou dos problemas de comunicação entre os aplicativos cliente e servidor configurados corretamente. Isso pode ser complicado se você nunca fez isso antes.
- Um ponto de falha. Se você tiver uma falha de serviço, todos os clientes serão afetados. Quando o código não é implantado dessa maneira, o risco pode ser menor (embora haja maneiras de atenuar isso).
- O controle de versão pode ser mais difícil de fazer. Quando você tem um aplicativo usando um serviço, as alterações na interface podem ser feitas ao mesmo tempo entre os dois. Quando você tem vários clientes agora, deve gerenciar quem está na V1, quem está na V2 e coordenar a remoção da V1 (depois de saber que todos foram atualizados para a V2).
O ponto principal é que nem sempre é um slam dunk tornar o serviço do sistema orientado. Na minha experiência, geralmente é uma boa ideia (costumo estruturar aplicativos dessa maneira), mas não é uma decisão automática. No final do dia, você precisa pesar os prós e os contras e tomar a decisão certa para sua situação.