Pregunta

Estoy diseñando una aplicación ASP.NET MVC usando el arquitectura de cebolla descrito por Jeffrey Palermo.

Es un proyecto ASP.NET MVC 2.0, donde estoy exigiendo que todos los puntos de vista pueden escribir encarecidamente el uso dedicados Visualización de modelos - no vamos a estar pasando modelos de dominio a nuestros puntos de vista. Estamos utilizando AutoMapper para hacer la traducción -. AutoMapper está aislado en la infraestructura, la Web no sabe o cuidado que AutoMapper se está utilizando

Actualmente, estoy definiendo las interfaces IViewModelMapping en el proyecto Web - simplemente porque este servicio será utilizado por los controladores y tiene acceso directo a sus propios Visualización de modelos. De esta manera la interfaz se puede acceder tanto a los modelos de dominio (en la base) y la vista Modelos (en la web).

Con el fin de proporcionar a la aplicación efectiva de las interfaces de IViewModelMapping, que crea un espacio de nombres ObjectMapping en el proyecto de Infraestructura, que aislará la implementación real de asignación a la intraestructura de la cebolla. Al hacerlo, esto requerirá Infraestructura a tener una dependencia de la inflación y la Web.

Mi pregunta es: ya que ambos de estos proyectos son técnicamente en las afueras de la cebolla (en la misma capa) - es un proyecto permite tener una dependencia de otro proyecto en esa capa? Alguien noto que las posibles dificultades con este diseño?

Un diseño alternativo estaría moviendo las interfaces IViewMapper en Core - pero esto sería imposible porque la base no tiene acceso a las clases ViewModel. También podía mover los modelos de vista en la base, pero me siento como lo harían no pertenecen allí, ya que son específicos de la capa de interfaz de usuario.

La arquitectura propuesta es la siguiente - Anuncio de que la infraestructura tiene una dependencia de núcleo y Web. restos Web aislado y sólo tiene acceso a la lógica de negocio.

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

¿Fue útil?

Solución

Tiene razón en que no desea Infraestructura depender de la interfaz de usuario (web), pero romper esa regla veces.

Yo pensaría en lugar de IViewModelMapping, crear IMapper con el método de mapa (). A continuación, la interfaz puede tener implementaciones que podrían tener que ver con la asignación de vista del modelo, o tal vez sólo mapeo regular. De cualquier manera, que la interfaz puede estar en Core, ya que no está obligado semánticamente a cualquier tipo de modelo.

Gran gráfico. Espero haber respondido a la carne de su pregunta. La filosofía general de la arquitectura de cebolla es mantener la lógica de negocio y el modelo en el centro (núcleo) de su solicitud y empujar sus dependencias en lo exterior como sea posible.

Otros consejos

Trate de mover Asignación de objetos en Web capa.

Su capa de web / UI puede depender de la capa de infraestructura. Pero no es un buen diseño para tener la dependencia de la Web en la capa de infraestructura. Cebolla arquitectura dice empujar sus dependencias en lo exterior como sea posible.

Se puede crear una carpeta "\ Builder" en la interfaz de usuario. Añadir un archivo de interfaz en ella, ejemplo .. iBuilder o IMapper y declarar un método como ConvertToViewModel o CreateMapping en ella. lo que quiera.

* Constructor ** IBuilder.cs -declare un método aquí. ** Builder.cs - - Aplicar el método aquí, definir el mapeo entre un modelo de vista y su correspondiente modelo de dominio (referencia de capa de núcleo) y volver ViewModel apropiado aquí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top