Usuário com melhor resposta
Qual a melhor maneira de usar Services em Mvc e DDD

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]
Respostas
-
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
- Sugerido como Resposta Yan Justino (MCP, MCST, MSP) segunda-feira, 19 de março de 2012 01:20
- Marcado como Resposta welington jrModerator terça-feira, 6 de março de 2018 16:08
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 facilSe 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
-
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
-
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
- Sugerido como Resposta Yan Justino (MCP, MCST, MSP) segunda-feira, 19 de março de 2012 01:20
- Marcado como Resposta welington jrModerator terça-feira, 6 de março de 2018 16:08
-
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