Estou gerenciando uma equipe de 15 desenvolvedores agora e estamos em um momento de escolher a tecnologia, onde a equipe é dividida em duas equipes completamente opostas, debatendo sobre o uso do WCF versus da Web API.
A equipe A, que oferece suporte ao uso da API da Web, apresenta os seguintes motivos:
- API Web é apenas a maneira moderna de escrever serviços ( Wikipedia )
- O WCF é uma sobrecarga para HTTP. É uma solução para TCP, Net Pipes e outros protocolos
- Os modelos WCF não são POCO, devido a [DataContract] e [DataMember] e a esses atributos
- SOAP não é tão legível e prático quanto JSON
- SOAP é uma sobrecarga para a rede em comparação com JSON (transporte sobre HTTP)
- Sem sobrecarga de método
A equipe B, que suporta o uso do WCF, diz:
- O WCF suporta vários protocolos (via configuração)
- O WCF suporta transações distribuídas
- Existem muitos bons exemplos e histórias de sucesso para o WCF (enquanto a API da Web ainda é jovem)
- Duplex é excelente para comunicação bidirecional
Esse debate continua e não sei o que fazer agora. Pessoalmente, acho que devemos usar uma ferramenta apenas para o local certo de uso . Em outras palavras, é melhor usarmos a API da Web, se quisermos expor um serviço por HTTP, mas usar o WCF quando se trata de TCP e Duplex.
Ao pesquisar na Internet, não conseguimos um resultado sólido. Existem muitos posts para apoiar o WCF, mas, pelo contrário, também encontramos pessoas queixando-se disso. Sei que a natureza dessa pergunta pode parecer discutível, mas precisamos de algumas boas dicas para decidir. Estamos presos em um ponto em que a escolha de uma tecnologia por acaso pode nos fazer lamentar mais tarde. Queremos escolher com os olhos abertos.
Nosso uso seria principalmente para a Web e exporíamos nossos serviços por HTTP. Em alguns casos (digamos 5 a 10%), talvez precisemos de transações distribuídas.
O que eu deveria fazer agora? Como gerencio esse debate de maneira construtiva?
Respostas:
Quando os dois lados têm bons argumentos e as opiniões sobre o assunto são fortes demais para chegar a um consenso, você, como gerente, precisa tomar uma decisão e encerrar o debate. Caso contrário, ele apenas girará em círculos e fortalecerá ainda mais as posições de todos os participantes. Quanto mais você esperar, mais difícil será para o lado "perdedor" admitir a derrota e trabalhar produtivamente com o resultado.
Anote todos os argumentos, avalie a importância deles para o projeto e depois tome sua decisão. Quando não puder, jogue uma moeda. É provável que seu projeto seja concluído com êxito com qualquer uma das tecnologias, e desperdiçar um tempo valioso com debates desnecessários custará apenas dinheiro desnecessário.
fonte
Supondo que ambos os lados estejam 100% corretos em todos os seus argumentos, quais são importantes?
Você se importa? Você está planejando fazer algo que exija POCO?
Novamente, isso é algo que você usará e precisará construir se não o tiver porque seguiu o outro caminho?
Basicamente, chegue ao coração de qual deles:
Qualquer argumento apresentado que não esteja no caminho do que você precisa realizar é irrelevante e não deve levar em consideração sua decisão, com algum espaço de manobra para considerar uma expansão futura.
fonte
Coloque meus dois centavos.
Como gerente, você deve pedir a seus colegas de equipe que tenham em mente o princípio Yagni . Isso ajudará a reduzir a lista de razões apresentadas pelas duas equipes.
Em vez de mergulhar em transações distribuídas, considere trabalhar com compensação .
A última coisa a considerar é a curva de aprendizado. Dependendo do prazo do seu projeto, como gerente, você poderá decidir se está certo começar a aprender uma nova tecnologia ou não.
Se você tiver muito tempo a perder, faça um tipo de Dia da Inovação em que as equipes A e B tenham um dia para produzir provas de conceitos com base nos mesmos requisitos.
A propósito, para quem diz que "os modelos WCF não são POCO, por causa de [DataContract] e [DataMember] e esses atributos ", diga a ele que POCOs geralmente são entidades de domínio e que não é uma prática recomendada expor seu objeto de domínio para qualquer tipo de cliente, é para isso que servem os DTOs.
fonte
Primeiro, mantenha a subjetividade afastada. Nos argumentos da sua equipe de WebAPI, acho que "a API da Web é apenas a maneira moderna" *, "os modelos WCF não são POCO, por causa desses atributos" e "SOAP não é tão legível e acessível quanto o JSON", bastante opinativo, se não completamente errado , e não ajudará a tomar uma decisão.
Então, o que fazer: decida o que você quer fazer com o (s) seu (s) serviço (s) , escolha uma técnica que acomode esse objetivo e sua capacidade de manutenção e extensibilidade com o mínimo de dor possível. Você pode fazer isso simplesmente pesquisando se algum aspecto é suportado pela estrutura a ser usada.
Material de leitura interessante:
*: observe que você se refere à Wikipedia para isso, onde a citação é: " Os aplicativos Web 2.0 da Web se afastaram de uma arquitetura orientada a serviços (SOA) com serviços Web baseados em SOAP para coleções mais coesas de recursos da Web RESTful" . Esse é um exemplo de uso para quando seu serviço deve ser consumido em uma página da web. Isso também pode ser feito facilmente com o WCF, usando o WebHttpBinding. Não diz "Use WebAPI para isso" .
Se essa pergunta se estender além do "como gerenciar a discussão" : eu usaria o WCF se os serviços fossem consumidos por clientes que não são da Web, porque seus metadados permitem uma geração de clientes fortemente tipada, surpreendentemente fácil.
fonte
Gerenciamento de equipe à parte, você não escolhe um sobre o outro. Você precisa examinar o objetivo de cada serviço da Web e usar a tecnologia apropriada para a parte específica do aplicativo. É como proibir procedimentos de armazenamento quando a equipe está usando a estrutura da entidade.
Em seguida, você escreve esses serviços da Web de 5 a 10% no WCF. Se o serviço deve ser referenciado internamente em outros projetos, não há debate. A vantagem da capacidade de importar o contrato WCF para criar o proxy do cliente NÃO está aberta para discussão. Leva toda a integração, eficiência e segurança de tipo a um nível totalmente novo.
Você escreve o que deve ser usado para solicitações de API pública (talvez) / Ajax na API da Web do Asp.net.
Se for apenas uma chamada ajax específica da página, você poderá usar o Asp.Net MVC.
Não escolha, abrace todos eles. A API da Web do WCF e do Asp.net serve a propósitos diferentes. Ninguém diz que você não pode comer maçã e laranja na salada de frutas. Tentar escolher um sobre o outro e empurrá-lo para baixo em todos os cenários é apenas pura preguiça.
fonte
Nossa equipe teve uma discussão semelhante há alguns meses. O fator decisivo para nós se resumiu a como criaríamos e implementaríamos cada tecnologia. Como já estávamos construindo um aplicativo MVC e estávamos usando o Knockout.js para ligação de dados, estávamos efetivamente usando o MVVM com os controladores sendo apenas uma API para dados.
Isso nos permitiu categorizar nosso uso das tecnologias com este projeto da seguinte maneira:
Embora isso possa não ser uma resposta popular ou hiper-técnica, determinar o que você precisa primeiro e como ou se a tecnologia ajudará foi o que ajudou minha equipe a decidir qual tecnologia usar onde.
fonte
Essa seria a abordagem mais razoável. É bastante comum ter serviços WCF e WebApi no mesmo aplicativo Web, onde ambos servem a propósitos diferentes.
Apenas para corrigir alguns argumentos:
Em muitos casos, os modelos WCF funcionam sem atributos de contrato de dados / membro de dados.
Não é verdade, mas os serviços Web WCF geralmente transportam XML simples em vez de SOAP inchado. Definitivamente, isso é legível.
Um argumento para o WCF: se houver um WSDL disponível, há toneladas de ferramentas em quase todas as tecnologias que podem criar proxies a partir dos metadados. Por outro lado, o esquema JSON ainda não é totalmente suportado.
fonte
Por que não andar na linha com o WCF Data Services? boas consultas no estilo OData / webapi e usabilidade com os poderes do WCF e a capacidade de retornar
JSON
perfeitamente. O Wcf também não é tão ruim se você tiver um bom código de hospedagem automática do wcf como o seguinte:https://github.com/ImaginaryDevelopment/MvcOdata
Eu diria que eles não estão muito separados, exceto que, quando usamos
WebApi
o front end eWCF data services
o nível intermediário,WebApi
vomitamos coisas simples como string contém ou operadores odata correspondentes a string.fonte
Um bom arquiteto adia as decisões de tecnologia até que sejam absolutamente necessárias.
Em outras palavras, não tome a decisão até que um cliente precise realmente se conectar. Você pode criar uma camada de serviço totalmente testada sem realmente colocar um mecanismo de transporte / comunicação sobre ela. Mais de 95% do trabalho pode ser feito "abaixo" do adaptador, fora da estrutura.
Na hora de expor esses serviços a clientes remotos, você pode escolher a estrutura mais moderna da prateleira e escrever invólucros finos em uma camada de serviço versátil.
Inferno, se sua camada de serviço "real" for bem-sucedida, você pode até tentar vários invólucros a um custo mínimo.
Essa é a resposta dogmática, de qualquer maneira. Na prática , convém escolher a ferramenta mais simples disponível para facilitar os testes de integração iniciais e frequentes - mas, ainda assim, limite sua dependência e trate-a estritamente como uma camada de comunicação simplesmente fina sobre os serviços reais .
Se você adotar essa abordagem, provavelmente descobrirá que escolhe a ferramenta mais simples de usar inicialmente e ninguém se incomodará , porque a equipe sabe que pode implementar uma ferramenta ou estrutura mais sofisticada ou moderna mais tarde, se necessário , com o mínimo esforço.
fonte
Portanto, agora estou enfrentando a mesma escolha, perguntei-me qual é o subconjunto de recursos do WCF que nossa equipe está usando no momento. Usamos protocolos diferentes? Não. Nós usamos suporte a transações? Não (embora usemos mecanismos personalizados de consistência eventual). Usamos duplex? Não.
Por que gostaríamos de usar a API da Web? Integração de front-end mais fácil (remove a camada de serviço adicional existente agora), SignalR para enviar respostas aos clientes, armazenar em cache para GETs.
Pode ser, pode-se encontrar outros motivos :) Além disso, motivos para permanecer no WCF.
fonte
Se eu estivesse na sua posição, começaria examinando as habilidades de sua equipe. Se todos na sua equipe já conhecem o WCF e apenas uma pequena porcentagem conhece a API da Web, sua decisão já está tomada para você.
De qualquer forma, se você tiver tempo, invista-o no aprendizado e no aprimoramento de sua base de conhecimento, mas não às custas da necessidade dos negócios e da produtividade da empresa.
fonte
Gostaria de perguntar qual modelo de interação você precisa apoiar? Sua interface externa desejada se parece mais com RPC ou REST? Na minha experiência, geralmente está em algum lugar entre, mas principalmente um ou outro.
Você está consumindo seus próprios serviços para outros projetos no .Net? Essa é provavelmente a pergunta mais reveladora que você pode fazer. O WCF tem a vantagem de poder abstrair suas interfaces em uma biblioteca de classes separada e criar e injetar seu cliente. Como uma extensão para isso, você pode montar seu projeto baseado no WCF com pontos de extremidade JSON e SOAP / WSDL, eu fiz isso. O WCF também oferece melhores garantias contra suas interfaces definidas.
Dito isso, se você espera ter clientes de outras plataformas XML em geral, muito menos o SOAP tem uma sobrecarga mensurável além do que os terminais JSON simples possuem. Se você seguir a rota JSON / API da Web, precisará melhorar muito a documentação de como interagir com seus terminais e API.
Em geral, sugiro escrever um documento simples da API que indique como você enviará dados e como deseja uma resposta para uma única estrutura de objeto de solicitação. Escreva seu caso de teste da maneira mais universal e documente-o como tal. Eu recomendaria uma simples instrução curl. Depois, vários de seus membros implementam isso usando o WCF e com a API da Web. Então veja quais vitórias.
Pessoalmente, apesar de ter feito alguns projetos e implementações relativamente grandes com o WCF, na verdade eu me inclino para a implementação mais simples que, na minha opinião, é o WCF direto com o uso de resultados JSON e algum comportamento de substituição no Global.asax.cs para lidar com condições de erro. Se a documentação de uma API incluir instruções curl, e você puder exercitar toda a funcionalidade da sua API com exemplos de curl, fica muito mais fácil para os clientes serem implementados em qualquer idioma que suporte interfaces da Web. É aqui que o WCF começa a cair. Ter uma API bem definida com documentação independente é melhor do que ter estruturas com ferramentas automatizadas ao lidar com sistemas externos. Falando como consumidor desses sistemas de outras plataformas.
Uma coisa além disso, é implementar seu cliente em dois idiomas diferentes. Faça um cliente em C #, mas também um no Node.js ou Python e veja como eles realmente se encaixam. Somente esse exercício ajudará você a se livrar das pontas soltas da sua API.
fonte