none
Qual a melhor maneira de usar Services em Mvc e DDD RRS feed

  • Pergunta

  • Opa!

    Seguinte, estou migrando um site de webforms para Asp.Net Mvc 3.


    Acontece que no site tenho uma Action action que uma 2 ViewModel  chamados  DadosAssinatura e ResumoVenda

         
       public ActionResult FinalizarAssinatura(DadosAssinatua dadosAssinatua)
            {
    
                Cliente c = dadosAssinatura.JaSouCliente != null && dadosAssinatura.JaSouCliente.Value
                                            ? dadosAssinatura.DadosAcesso.RetornarCliente()
                                            : dadosAssinatura.DadosCliente.RetornarNovoCliente();
    
                string retorno = GerenciadoContratacao.SalvarItens(c, model.CarrinhoCompras);
    
                ResumoVenda r = new ResumoVenda(retorno);
    
                return View(r);
    
            }



    Cliente e CarrinhoCompras são de uma outra dll, assim como GerenciadoContratacao que é uma classe estatica. Eu sei que esta arquitetura é ruim (com classes burras e gerenciadores) e ja começamos a recriar com DDD, mas emfim...

     Só que ficou muito ruim de testar entao instalei o ninject e criei uma interface chamada  IServicoAssinatura


     
    class ServicoAssinatura : IServicoAssinatura
        {
            private readonly IUnitOfWork _unitOfWork;
    
            public ServicoAssinatura(IUnitOfWork unitOfWork)
            {
                _unitOfWork = unitOfWork;
            }
    
            public ResumoVenda FinalizarAssinatura(HttpContextBase httpContext, DadosAssinatura dadosAssinatura)
            {
    
              Cliente c = dadosAssinatura.JaSouCliente != null && dadosAssinatura.JaSouCliente.Value
                                            ? dadosAssinatura.DadosAcesso.RetornarCliente(_unitOfWork)
                                            : dadosAssinatura.DadosCliente.RetornarNovoCliente();
    
                string retorno = GerenciadoContratacao.SalvarItens(c, model.CarrinhoCompras);
    
                ResumoVenda r = new ResumoVenda(retorno);
    
                return View(r);
    
            }
    
    }
    
     class ServicoAssinaturaFake : IServicoAssinatura
        {
            public ServicoAssinaturaFake ()
            {           
            }
    
            public ResumoVenda FinalizarAssinatura(HttpContextBase httpContext, DadosAssinatura dadosAssinatura)
            {
                string retorno = "asdasda";
    
                ResumoVenda r = new ResumoVenda(retorno);
    
                return View(r);
            }
    
       }




    Minhas duvidas são?

    * devo Utilizar Servicos (tá mais pra adapter) para isto ou ha um jeito melhor?
    *devo criar um projeto só para estes servicos ou crio somente uma pasta para deixa-los?
    * este GerenciadorContratacao é minha camada de Aplicação do DDD (a grosso modo)?
    * as viewModel podem ter metodos como dadosAssinatura.DadosAcesso.RetornarCliente(_unitOfWork)  e dadosAssinatura.DadosCliente.RetornarNovoCliente() ou deixo tudo no servico?
    pois fica mais facil


    //metodo se fosse na ViewModel DadosCliente
      private Cliente RetornarNovoCliente()
            {
                return new Cliente(NomeCompleto,RazaoSocial,Endereco, Complemento, Bairro, Cidade,Estado, Cep);
            }
    
    //metodo se fosse na classe ServicoAssinatura
      private Cliente RetornarNovoCliente(DadosCliente dadosCliente)
            {
                return new Cliente(dadosCliente.NomeCompleto,dadosCliente.RazaoSocial,
                        dadosCliente.Endereco, dadosCliente.Complemento, dadosCliente.Bairro, dadosCliente.Cidade,
                        dadosCliente.Estado, dadosCliente.Cep);
            }
    




    Valeu!
    • Editado Fernando Mondo segunda-feira, 12 de dezembro de 2011 11:54 coloquei as tags [code]
    segunda-feira, 12 de dezembro de 2011 11:11

Respostas

Todas as Respostas

  • Caro Fernando, vou responder com base na minha prática em projetos com  mesmas características apresentadas por você

    * devo Utilizar Servicos (tá mais pra adapter) para isto ou ha um jeito melhor?
    Na minha concepção, os seus serviços parecem assumir um papel da camada de aplicação quando você injeta nele coisas do tipo HttpContextBase. Outra ponto é que parece existir uma forte injeção de Dependência com a camada de infraestrutura de Dados.

    *devo criar um projeto só para estes servicos ou crio somente uma pasta para deixa-los?
    Eu adoto criar em projetos diferentes e além disso coloco estes projetos em Pastas de solução para dar maior visibilidade das camadas. Separar este fonte lhe permite escrever testes para esta camada separadamente de outras. Também, Evita que você fique fazendo transposição de código na hora que precisar migrar de padrão ou utilizar outra plataforma. Basta pensar, Se você precisasse escrever um módulo mobile e estas classes estivessem em uma pasta do projeto MVC, será que seria necessário referenciar o projeto mvc no projeto mobile. Acho que não.

    * este GerenciadorContratacao é minha camada de Aplicação do DDD (a grosso modo)?
    Aparentemente, como está descrito, sim!


    * as viewModel podem ter metodos como dadosAssinatura.DadosAcesso.RetornarCliente(_unitOfWork)  e dadosAssinatura.DadosCliente.RetornarNovoCliente() ou deixo tudo no servico?
    pois fica mais facil 

    Se o que você chama de ViewModel se comportar como Entidade (Entity) de Negócio, não! Estas classes não deveriam conter: primeiramente, Forte dependência com sua infraestrutura de Dados; segundo, regras de negócio. Deixar entidades de negócio mais enxutas apenas para o transporte é o que eu tenho adotado e lido em documentações oficiais

    Bem, espero que tenha colaborado e se precisar de mais alguma coisa é só perguntar. Fico a disposição!


    Yan Justino

    quinta-feira, 1 de março de 2012 01:04
  • Olá Fernando, sobre DDD e Serviços acredito que esta imagem irá te ajudar...
    Outra conceito importante de DDD, evite entidades anêmicas, ou seja, que não possuam propriedades e comportamentos, como os famigerados BO, VO etc.

    Um link interessante http://www.slideshare.net/rponte/entendendo-domaindriven-design

    quinta-feira, 1 de março de 2012 11:58
  • Cara, aqui vai uma dica de ouro pra você:

    No link abaixo está um webcast do Giovanni Bassi sobre DDD, Asp.net MVC e EF. É um vídeo muito prático e muito legal. Olha lá!

    https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032449968&culture=pt-BR


    Yan Justino

    segunda-feira, 5 de março de 2012 22:48
  • Cara, aqui vai uma dica de ouro pra você:

    No link abaixo está um webcast do Giovanni Bassi sobre DDD, Asp.net MVC e EF. É um vídeo muito prático e muito legal. Olha lá!

    https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032449968&culture=pt-BR


    Yan Justino

    Bom dia Yan, muito bom mesmo!!!

    Acredito que não vai só  ajuda o Fernando, mais sim muita gente!

    Abraço.


    Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como resposta

    terça-feira, 6 de março de 2012 12:36