Dependências da arquitetura Onion na mesma camada:Infraestrutura e comunicação Web
-
22-09-2019 - |
Pergunta
Estou projetando um aplicativo ASP.NET MVC usando o Arquitetura Cebola descrito por Jeffrey Palermo.
É um projeto ASP.NET MVC 2.0, onde estou exigindo que todas as visualizações sejam fortemente tipadas usando modelos de visualização dedicados - não passaremos modelos de domínio para nossas visualizações.Estamos usando o AutoMapper para fazer a tradução - o AutoMapper está isolado na infraestrutura, a Web não sabe nem se importa que o AutoMapper esteja sendo usado.
Atualmente, estou definindo as interfaces IViewModelMapping no projeto Web - simplesmente porque este serviço será utilizado pelos Controllers e terá acesso direto aos seus próprios View Models.Desta forma a interface pode acessar tanto os Modelos de Domínio (no Core) quanto os Modelos de Visualização (na Web).
Para fornecer a implementação real das interfaces IViewModelMapping, criei um namespace ObjectMapping no projeto Infraestrutura, que isolará a implementação real do mapeamento para a Intraestrutura da cebola.Ao fazer isso, isso exigirá que a infraestrutura dependa tanto do Core quanto da Web.
Minha pergunta é:uma vez que ambos os projetos estão tecnicamente na periferia da cebola (na mesma camada) - é permitido que um projeto dependa de outro projeto nessa camada?Alguém percebe alguma armadilha potencial com esse design?
Um design alternativo seria mover as interfaces IViewMapper para o Core - mas isso seria impossível porque o Core não tem acesso às classes ViewModel.Eu também poderia mover os modelos de visualização para o Core, mas sinto que eles não pertenceriam a esse lugar, pois são específicos da camada de UI.
A arquitetura proposta é a seguinte - observe que a infraestrutura depende do Core AND Web.A Web permanece isolada e só tem acesso à lógica de negócios Core.
Solução
Você está certo de que não deseja que a infraestrutura dependa da interface do usuário (Web), mas às vezes eu quebro essa regra.
Eu acho que, em vez de IViewModelMapping, crie o IMAPPER com o Method Map (). Em seguida, a interface pode ter implementações que podem ter a ver com o mapeamento de modelos de exibição, ou talvez apenas o mapeamento regular. De qualquer forma, essa interface pode estar no núcleo porque não está semanticamente vinculada a nenhum tipo de modelo.
Ótimo gráfico. Espero ter respondido a carne da sua pergunta. A filosofia geral da arquitetura de cebola é manter sua lógica e modelo de negócios no meio (núcleo) do seu aplicativo e empurrar suas dependências o mais longe possível.
Outras dicas
Não, não há CUs para pacotes de idiomas.
Sua camada Web/UI pode depender da camada de infraestrutura.Mas não é um bom design ter dependência da camada Web na infraestrutura.A arquitetura Onion diz que empurre suas dependências o mais longe possível.
Você pode criar uma pasta "\Builder" na UI.Adicione um arquivo de interface nele, por exemplo.IBuilder ou IMapper e declare um método como ConvertToViewModel ou CreateMapping nele.o que você quiser.
*Builder ** ibuilder.cs -declare um método aqui.**Builder.cs -- - Implemente o método aqui, defina o mapeamento entre um ViewModel e seu DomainModel correspondente (referência da camada principal) e retorne o ViewModel apropriado aqui.