none
DDD, DTO e SOA. Dúvidas em cenário complexo RRS feed

  • Pergunta

  •  

    Boa noite Srs!

     

    Desculpem o tamanho do post, mas é que esse problema vem me incomodando bastente.

     

    Estou modelando atualmente uma aplicação de grande porte para internet que deve atender inicialmente cerca de 60 mil usuários único/dia. Estamos adotando uma abordagem fundamentada em conceitos SOA através de WCF "cru" inicialmente e que nos permita evoluir para processos e sistemas mais robustos no futuro. O objetivo é chegar em uma arquitetura de sistemas novos e legados bastante flexível e com facilidade na manutenibilidade, mas sem perder performance, portanto vamos andar pra frente de passo em passo, sem pressa.

     

    Hoje, estou efetuando alguns tests de stress e alguns acertos na implementação do modelo proposto. No entanto cheguei em um ponto onde surgiu me uma dúvida quanto a modelagem das classes que tratam de proxy e gostaria da opinião dos colegas que são bem mais experientes do que eu.

     

    Alguns dos pontos que utilizei estão baseados neste artigo (http://msdn2.microsoft.com/en-us/library/ms978348.aspx).

     

    O cenário é o seguinte:

     

    Tenho uma aplicação Web que irá consumir User Process Components de acordo com o link acima e este por sua vez irá chamar um Service Agent que será o responsável pelas traduções técnicas da implementação da chamada do WCF.

     

    O WCF irá expor serviços relativos a produtos e estou tentando aplicar um padrão de modelagem DDD utilizando DTO para receber as informações do cliente (aplicação Web descrita no paragráfo acima).

     

    Minhas dúvidas são:

     

    1) O cliente quando for consumir o WCF irá faze-lo através do proxy gerado do serviço. O serviço expõe DataContracts que podem ser incarados como os Transfer Objects do pattern DTO. No entanto, me parece um bad smell (de acordo com Fowler) o fato de eu utilizar nos meus UI Process Components os próprios DataContracts retornados pelo WCF. Então, na minha camada de Service Agent eu acabo transformando esses DataContracs em objetos de domínio utilizados pelos UI Process Components. O problema dessa implementação é que eu acabo replicando o modelo de domínio em diversos lugares da aplicação e também gero overhead desnecessário, pois crio uma camada apenas responsável por transformar objetos Proxy em Objetos de domínio.

     

    2) Este bad smell também é relacionado com a dúvida acima. Do mesmo jeito que eu faço a tradução no lado do cliente, eu preciso efetuar esta tradução no lado do servidor, ou seja, recebo as informações através de DataContracts e tenho que transformá-los no meu modelo de domínio para não quebrar o príncipio das responsabilidades únicas que a OO nos prega.

     

    Qualquer opinião e abordagem diferente da minha é MUITO bem vinda, pois já busquei esse tipo de informação em diversas fontes e não consegui chegar a nenhuma conclusão diferente dessa que estou expondo. Meu grande problema, é ter meu modelo de domínio exposto em praticamente 4 lugares diferentes da minha aplicação: 1) Aplicação Web Cliente, 2) Serviço WCF, 3) Modelo de domínio por trás do serviço e 4) Value Objects utilizados para covnersação entre as camadas.

     

    Se ficar difícil de entender, eu elaboro um diagrama a fim de esclarecer melhor o cenário.

     

    Muito obrigado a todo! Smile

    terça-feira, 11 de março de 2008 21:23

Respostas

  • Olá Antônio,

     

    Segue meu ponto de vista inicial.

     

    Serviço = Processo Reutilizável

     

    Exponha somente o que for necessário e se for necessário.  Já vi em alguns clientes, alguns desenvolvedores promoverem todos seus métodos a serviço através de um WS. Resultado : Aplicação lenta.

     

    Imagine você ter que falar com seu visinho e em vez de bater em sua porta como de costume você envia um sedex dizendo que gostaria de falar com ele.

     

    WebService é necessário em cenários que você necessita comunicar-se com aplicações que não falam a mesma "lingua" ou estão em "fazendas" diferentes.

     

    Um amigo que mora na África, faz mais sentido um SEDEX....

     

    Agora ,se sua aplicação vai fornecer um processo reutilizável para outras as aplicações, por favor, faça um WCF disto.

     

    Dá uma olhada nesse artigo, pode te ajudar na organização.

    http://oiatec.blogspot.com/2007/09/macroinformtica-o-qu-ficou-louco.html

     

     

    E vamos nos comunicando.

     

    []´s

     

     

     

     

     

     

     

     

     

     

     

     

     

    quarta-feira, 26 de março de 2008 15:41
  • Muito obrigado em querer ajudar Alex!

    Vamos lá...vou tentar expor o que entendi da sua resposta.

    Você me diz para utilizar WCF por conta da versatilidade. De fato, estou utilizando inclusive com binding TCP, portanto não vou ter os problemas de overhead de binding SOAP/WS.

    Atualmente só estão previstar comunicações dentro da própria plataforma, mas caso seja necessário integrar com outros fornecedores facilmente eu posso adicionar um binding SOAP/WS e resolver o problema rapidinho.

    No entanto, o que de fato me incomoda é as responsabilidades que o WCF tem nesse pacote todo. De acordo com meu entendimento, cada camada e classe deve ter uma responsabilidade distinta e buscar ao máximo não depender uma da outra. Por conta disso é que surgiu essa dúvida existencial com relação ao modelo de dominio.

    Geralmente, modelamos o WCF de acordo com nossas classes de negócio e utilizamos VOs como objetos de transporte. No caso do WCF esses VOs (DTOs) são os DataContracts que acabam sendo criados lá na camada de Acesso a Dados e são transportados por toda a aplicação até chegar na camada de Apresentação onde são consumidos. Contudo, acredito que o papel deles (DataContracts) não seja esse, mas apenas efetuar o transporte dos dados quando a aplicação é distribuida fisicamente. Dessa forma, eu acabo dando responsabilidades demais para essa camada (cuidar do transporte dos dados entre camadas fisicas e ainda servir de objetos de binding e transporte dentro da aplicação em si) e por isso estou buscando uma alternativa no modelo explicado no meu primeiro post.

    Muito confuso? Stick out tongue

    Obrigado novamente!
    quarta-feira, 26 de março de 2008 20:38

Todas as Respostas

  • Olá Antônio,

     

    Segue meu ponto de vista inicial.

     

    Serviço = Processo Reutilizável

     

    Exponha somente o que for necessário e se for necessário.  Já vi em alguns clientes, alguns desenvolvedores promoverem todos seus métodos a serviço através de um WS. Resultado : Aplicação lenta.

     

    Imagine você ter que falar com seu visinho e em vez de bater em sua porta como de costume você envia um sedex dizendo que gostaria de falar com ele.

     

    WebService é necessário em cenários que você necessita comunicar-se com aplicações que não falam a mesma "lingua" ou estão em "fazendas" diferentes.

     

    Um amigo que mora na África, faz mais sentido um SEDEX....

     

    Agora ,se sua aplicação vai fornecer um processo reutilizável para outras as aplicações, por favor, faça um WCF disto.

     

    Dá uma olhada nesse artigo, pode te ajudar na organização.

    http://oiatec.blogspot.com/2007/09/macroinformtica-o-qu-ficou-louco.html

     

     

    E vamos nos comunicando.

     

    []´s

     

     

     

     

     

     

     

     

     

     

     

     

     

    quarta-feira, 26 de março de 2008 15:41
  • Muito obrigado em querer ajudar Alex!

    Vamos lá...vou tentar expor o que entendi da sua resposta.

    Você me diz para utilizar WCF por conta da versatilidade. De fato, estou utilizando inclusive com binding TCP, portanto não vou ter os problemas de overhead de binding SOAP/WS.

    Atualmente só estão previstar comunicações dentro da própria plataforma, mas caso seja necessário integrar com outros fornecedores facilmente eu posso adicionar um binding SOAP/WS e resolver o problema rapidinho.

    No entanto, o que de fato me incomoda é as responsabilidades que o WCF tem nesse pacote todo. De acordo com meu entendimento, cada camada e classe deve ter uma responsabilidade distinta e buscar ao máximo não depender uma da outra. Por conta disso é que surgiu essa dúvida existencial com relação ao modelo de dominio.

    Geralmente, modelamos o WCF de acordo com nossas classes de negócio e utilizamos VOs como objetos de transporte. No caso do WCF esses VOs (DTOs) são os DataContracts que acabam sendo criados lá na camada de Acesso a Dados e são transportados por toda a aplicação até chegar na camada de Apresentação onde são consumidos. Contudo, acredito que o papel deles (DataContracts) não seja esse, mas apenas efetuar o transporte dos dados quando a aplicação é distribuida fisicamente. Dessa forma, eu acabo dando responsabilidades demais para essa camada (cuidar do transporte dos dados entre camadas fisicas e ainda servir de objetos de binding e transporte dentro da aplicação em si) e por isso estou buscando uma alternativa no modelo explicado no meu primeiro post.

    Muito confuso? Stick out tongue

    Obrigado novamente!
    quarta-feira, 26 de março de 2008 20:38