6

Actualmente estoy tratando de refactorizar un proyecto (asp.net mvc) que no tiene ninguna separación en absoluto. acaba de carpetas: s¿Cuál es una estructura de solución recomendada para un sitio web algo grande en asp.net

  • El proyecto tiene un montón de código EF primeras clases (People.cs, Exam.cs, Message.cs, etc.)
  • El proyecto tiene varios repositorios (que todo el uso de datos EF Contexto)
  • y, por supuesto, una gran cantidad de controladores y ViewModels

tenemos un proyecto de pruebas, pero nos enviaban muy bueno en TDD así que no es algo que realmente estamos trabajando a partir de ahora.

Me gustaría tener una separación más clara en las diferentes responsabilidades que el proyecto tiene que abordar y agradecería algunos consejos sobre una buena estructura de proyecto que lo logre.

Por favor ayuda. gracias de antemano

Respuesta

12

Yo sugeriría siguiendo un Domain Driven Design (DDD), y un camino por el que se sugiere de esto sería la creación de los siguientes proyectos:

Company.Project.Web < - Su aplicación MVC, aunque todavía se puede utilizar formularios Web Company.Project.Domain < - Objetos transferencia de datos (DTO), ViewModels, la lógica de negocios, eventos Company.Project.Data < - Interfaces repositorio

Company.Project.Data.EF < - Ent ityFramework implementación específica de repositorios Company.Project.Model < - Sus clases de EF CodeFirst

Company.Common < - Un proyecto común de los servicios públicos y/o extensiones

yo sugeriría que eche un vistazo al Proyecto Silk http://silk.codeplex.com/ de los patrones y equipo de prácticas. Gran implementación de referencia de DDD, Repository y MVC, así como mezcla en HTML 5 y jQuery (vNext).

+0

Estoy de acuerdo con la adición de las interfaces, y me gustaría utilizar un contenedor IoC para encargarme de resolver la interfaz para la implementación en tiempo de ejecución. –

+0

He leído que viewModels no debe interactuar con la capa de servicio (lógica comercial). ¿No deberían seguir siendo el proyecto web? – ignaciofuentes

+0

Generalmente conservamos ViewModels en el proyecto web. Sin embargo, nuestros DTO pueden ser utilizados directamente por la capa de presentación, ya sea Web o Servicios o WPF (XAML). Un contenedor IoC como Unity es una necesidad para mantener nuestras preocupaciones separadas e inyectar nuestras dependencias de servicio. – jdmonty

11

Utilizamos un diseño similar al mencionado por jdmonty pero un poco más simple. Hacemos lo siguiente:

  • ApplicationName.Web - Aplicación MVC
  • ApplicationName.Services - La lógica de negocio
  • ApplicationName.Domain - clases de EF CodeFirst y los repositorios que actúan sobre ellas
  • ApplicationName.Common - Clases y utilidades utilizadas por varios proyectos
  • ApplicationName.Tests - Prueba para los diversos proyectos

El proyecto Web depende del proyecto de servicios.El proyecto de Servicios depende del proyecto de Dominio.

+0

Gracias por este consejo. se ve bastante limpio ... ¿te importaría dar un poco más de detalles sobre dónde guardas tus Modelos de Vista? ... ¿interactúan con el proyecto de Servicios? – ignaciofuentes

+3

Conservamos ViewModels en el proyecto web porque, como mencionó, no deberían interactuar con la capa de servicio. Los ViewModels se usan exclusivamente para transferir datos entre las Vistas y el Controlador. –

+0

Nick, ¿está utilizando DataAnnotations en sus modelos de vista para la validación? Si lo hace, ¿podríamos decir que estas validaciones también son lógica de negocios? –

Cuestiones relacionadas