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.

http://www.matthidinger.com/images/onion-arch.png

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top