Nossa empresa está iniciando uma iniciativa SOA bastante grande. Estamos fazendo muitas coisas certas: há uma boa comunicação; dinheiro para ferramentas, quando apropriado; e adquirimos uma boa experiência para nos ajudar na transição.
Estamos tentando desenvolver padrões que possamos seguir como um grupo, e um dos padrões propostos está me incomodando bastante:
Padronizamos o padrão em que toda operação pega um objeto de solicitação e retorna um objeto de resposta.
Percebo que essa é uma abordagem mais ou menos padrão para muitas pessoas, mas estou perguntando por que devo me preocupar. (Eu não sou tão bom com a sabedoria recebida, preciso do porquê).
A maioria dos serviços que fornecerei são simples recuperação de metadados organizacionais. Por exemplo, encontre a política de segurança para um usuário específico. Isso precisa de uma identificação de usuário e nada mais. O padrão diz que eu devo agrupar essa solicitação em um objeto e agrupar a política retornada em um objeto de resposta.
Meu mal-estar é amplificado pela análise do WSDL gerado a partir de nossos contratos. O WCF gera mensagens de solicitação e resposta automaticamente e agrupa até o objeto de solicitação / resposta.
Entendo perfeitamente que, se você estiver fazendo uma solicitação complexa, é necessário um objeto de entrada complexo. Isso é o que você faria mesmo se os serviços não estivessem envolvidos.
Minha pergunta é por que devo envolver automaticamente solicitações e respostas quando:
- Torna os serviços simples menos expressivos
- Você faria isso de qualquer maneira por um serviço complexo
- O WCF cria uma mensagem de solicitação / resposta de qualquer maneira
Encontrei os seguintes argumentos a favor dessa abordagem:
Ele suporta controle de versão, permitindo que parâmetros opcionais sejam inseridos no objeto de solicitação.
Naquela época, eu fazia bastante COM, e consideraria isso quase um antipadrão para versionamento. Para algumas coisas, acho que ajudaria, mas espero que, onde ajudaria, você já tenha um objeto de parâmetro de qualquer maneira.
Permite que dados e comportamentos comuns sejam isolados em uma classe base
Este carrega algum peso comigo.
Afasta as pessoas de um comportamento no estilo RPC e em direção ao comportamento de mensagens
Eu li isso no site da Microsoft e o ouvi de nosso guru, mas ainda não tenho uma idéia clara do que eles significam ou por que é valioso. Será que as interfaces com aparência natural fazem as pessoas esquecerem que estão chamando um serviço remoto?
Eu estou olhando para refatorar as assinaturas de talvez 300 métodos, então isso é uma quantidade não trivial de dor. Sou um grande fã de consistência nas implementações, por isso estou disposto a enfrentar a dor, isso só ajudará a saber que tudo valerá a pena no final.
As anotações de Martin Fowler sobre o objeto de transferência de dados são apropriadas aqui, eu acho.
O mesmo pode se aplicar a solicitações. Quanto ao RPC, e por que é ruim:
Eu acho que é verdade, mas não a principal razão. Outro motivo para evitar o RPC é que ele pode incentivar clientes e serviços fortemente acoplados.
fonte