2010-09-01 25 views
5

He estado usando ASP.net MVC durante aproximadamente dos años y todavía estoy aprendiendo la mejor manera de estructurar una aplicación.consejos sobre la arquitectura de aplicaciones asp.net mvc

Quería descartar estas ideas que he reunido y ver si son formas "aceptables" en la comunidad para diseñar aplicaciones MVC.

Aquí está mi diseño básico:

  • DataAccess Proyecto - Contiene todas las clases de repositorios, los contextos de datos LINQ a SQL, filtros y objetos de negocio personalizadas para repositorios que no sea MS SQL db (que LINQ-to-SQL no crea). Los repositorios generalmente solo tienen CRUD básico para el objeto que están administrando.

  • Proyecto de servicio - Contiene clases de servicio que realizan la lógica empresarial. Toman órdenes de los Controladores y le dicen a los repositorios qué hacer.

  • UI Project - Contiene modelos de vista y algunas envolturas sobre cosas como el ConfigurationManager (para pruebas unitarias).

  • Main MVC Project - Contiene controladores y vistas, junto con javascript y css.

que sí parece esto como una buena manera de estructurar las aplicaciones ASP.NET MVC 2? ¿Alguna otra idea o sugerencia?

¿Se utilizan los modelos de vista para todos los resultados de las vistas y las entradas de las vistas?

Me inclino por el camino de hacer modelos de vista para cada objeto comercial que necesita mostrar datos en la vista y convertirlos en clases básicas con un conjunto de propiedades que son todas cadenas. Esto hace que tratar con las vistas sea bastante fácil. La capa de servicio necesita administrar las propiedades de mapeo del modelo de vista al objeto de negocio. Esta es una fuente de confusión porque la mayoría de los ejemplos que he visto en MVC/MVC2 no usan un modelo de vista a menos que necesite algo como un cuadro combinado.

Si usa la nueva validación del modelo de MVC 2, ¿validaría el objeto viewmodel y no tendría que preocuparse por poner los atributos de validación en los objetos comerciales?

¿Cómo se prueba unitariamente este tipo de validación o no debo probar por unidad que se devuelvan los mensajes de validación?

Gracias!

+0

Suena un poco exagerado. Además, ¿no tiene la intención de usar áreas por proyecto? Además, parece un buen candidato para un Wiki de la comunidad. :) – bzlm

+0

A menos que esté planeando usar sus proyectos individuales en otras aplicaciones, o la aplicación va a ser muy grande, debería estar bien con un solo proyecto. –

+0

@bzlm: Al principio pensé lo mismo sobre áreas, pero las áreas MVC no son lo mismo de lo que él está hablando; sus proyectos son simplemente contenedores arbitrarios para sus niveles de software. –

Respuesta

2

Interesante.

Una cosa que hago diferente es que me separé de mi proyecto de DataAccess de mi proyecto de Dominio. El proyecto de dominio todavía contiene todas las interfaces para mis repositorios, pero mi proyecto de DataAccess contiene todas las implementaciones concretas de ellos.

No desea que cosas como DataContext se filtren en su proyecto de dominio. Después del onion architecture su dominio no debería tener dependencias en la infraestructura externa ... Considero que DataAccess tiene eso porque está directamente relacionado con una base de datos.

Dividirlos significa que mi dominio no tiene una dependencia en ningún ORM o base de datos, por lo que puedo cambiarlos fácilmente si es necesario.

Saludos,
Charles

Ps. ¿Cómo se ve la dependencia de tu proyecto? Me he estado preguntando dónde colocar mis ViewModels. Quizás un proyecto de IU separado sea una buena idea, pero no estoy del todo seguro de cómo funcionaría. ¿Cómo fluyen a través de los diferentes niveles de proyecto de su aplicación?

+0

Jead leyendo tus comentarios y parece que no puedes hacer esto con Linq to SQL, lo cual es cierto. Definitivamente consideraría usar NHibernate o EntityFramework CodeFirst. EF CodeFirst es realmente genial ... Lo estoy usando con un esquema existente y solo me he encontrado con un problema, pero eso tenía más que ver con la forma (estúpidamente) en que se diseñó la base de datos. – Charlino

+0

La dependencia del proyecto es algo como esto: El proyecto principal de MVC depende de DataAccess, el Servicio y la IU; DataAccess no depende de nada (que no sea linq/ef framework); El servicio depende de los proyectos de DataAccess y UI; y UI no depende de nada. Como dije, tengo algunas clases de contenedor en la interfaz de usuario que me hacen agregar una dependencia al framework MVC. He estado debatiendo si mover esas clases en el proyecto MVC para eliminar esta dependencia. Entonces, la IU solo contendría las clases modelo de vista simple. – Dragn1821

+0

Actualmente, estoy pensando en utilizar los modelos de vista para aceptar todas las entradas o para mostrar la salida en el nivel de vista.Luego, el controlador pasaría el modelo de vista a la capa de servicio donde el modelo de vista se correlacionaría con la clase ORM que crea LINQ-to-SQL antes de pasar la clase ORM al repositorio. O bien, la clase ORM se lee del repositorio y se correlaciona con la clase de modelo de vista que se devuelve desde la capa de servicio a través del controlador y a la vista. Entonces, la capa de servicio haría todo el trabajo pesado. ¿Esto suena como un buen enfoque? – Dragn1821

Cuestiones relacionadas