2012-01-24 18 views
5

Estoy tratando de encontrar la mejor forma de diseñar mi proyecto MVC 3. Al buscar en línea, encontré una sugerencia que decía básicamente hacer clic derecho en el proyecto y agregar área. Lo que esto hizo fue crear una carpeta de área con la misma estructura de controlador/vista/modelo en el mismo proyecto. Esto no es lo que quiero. Quiero la flexibilidad de tener proyectos separados. Mantendré solo las vistas en el proyecto web principal. Todo lo demás en un proyecto separado.MVC 3 project structure

Para ese intento creé un proyecto separado para mis controladores. Ahora estoy atascado con señalar una acción de controlador a una vista. En todos los ejemplos en línea, se hizo clic con el botón derecho y se agregó una vista. Siendo este un proyecto de biblioteca de clase, no tengo esa flexibilidad. ¿Dónde me estoy equivocando?

Todos los ejemplos que he encontrado, incluidos los que he visto en Asp.net, básicamente explican cómo crear aplicaciones de estudio, lo que solo es bueno para fines de aprendizaje. Una gran aplicación comercial no puede tener todas las vistas/modelos/controladores en un solo proyecto. ¿O es así como se supone que debe ir en MVC? No estoy seguro de si hacer todo con los clics del mouse también es una buena idea. En el mundo de los formularios web también hubo muchas aplicaciones de estudio para principiantes que usaban clics del mouse para crear aplicaciones CRUD básicas, pero en proyectos comerciales reales, nunca usamos esos métodos.

¿Cuáles son sus pensamientos, orientación sobre esto?

Gracias por su tiempo ...

+6

¿Por qué una aplicación comercial grande no puede tener todas las vistas, modelos y controladores en un solo proyecto? –

+0

¿Pueden? ¿Ellos? ¿Alguien ha tenido experiencia en poner todo en un solo proyecto y no tuvo problemas para hacerlo de esa manera en el largo plazo? En un proyecto de formularios web, el código subyacente llamaría a la capa de aplicaciones o a la capa de negocios que estaba en un proyecto separado. ¿Eso no se hace aquí en el mundo asp.net MVC? No soy reacio a poner todo en un solo proyecto. Todo lo que necesito es la orientación de alguien con la experiencia de hacerlo de esa manera ... y confirmando que es la mejor manera ... o al menos una de las mejores maneras. – user20358

Respuesta

8

MVC está basado en una convención; la convención es que pone todas las vistas en/vistas, los modelos en/modelos y los controladores en/controladores. Puede cambiar la convención pero no hará su vida más fácil.

Desde un punto de vista conceptual esto tiene sentido. Si mantiene toda la lógica de dominio y el acceso a los datos en proyectos separados, todo lo que le queda es el material relacionado con la web, sus controladores, ver modelos y vistas. Ese es tu proyecto MVC.

Tenga en cuenta que si desea dividir partes en proyectos separados, puede encontrar útil portable areas.

+0

¿No hay áreas para MVC 3 compatibles con Microsoft? ¿Por qué no puedo encontrar documentación sobre el mismo en MSDN o asp.net o en cualquier otro sitio de Microsoft? – user20358

+0

Claro, es totalmente compatible. No estoy seguro acerca de los documentos en MSDN u otros sitios, prefiero leer libros para obtener una base sólida de conocimiento sobre una tecnología (vea [mi respuesta] (http://stackoverflow.com/a/8590071/64096) para una pregunta un tanto relacionada). –

+0

Por cierto, una búsqueda rápida en Google produce [este walktrough] (http://msdn.microsoft.com/en-us/library/ie/ee671793.aspx) en MSDN y un [video introductorio] (http: // www. asp.net/mvc/videos/mvc-2/how-do-i/aspnet-mvc-2-areas) en asp.net. –

4

no veo por qué no puede utilizar el incorporado en los generadores como base para sus puntos de vista y los controladores? Nada dice que debes dejarlos tal como se generaron. Personalmente, creo que es realmente bueno generar una base para mí (con clics del mouse).

El proyecto MVC es solo una capa de interfaz de usuario. Es una locura poner la lógica en él para aplicaciones a gran escala. Por lo tanto, está bien tener un proyecto para toda la interfaz de usuario. De hecho, hace que sea más fácil obtener una visión general de la IU.

Dicho esto, hay formas de obtener una solución basada en un complemento donde puede mover los controladores (, modelos y vistas) a las bibliotecas de clases. Pero no es fácil.

  1. Es necesario crear un proveedor de ruta virtual (para encontrar los puntos de vista)
  2. Hacer todas las vistas incrustadas
  3. Modificar el archivo de proyecto para obtener el "Añadir punto de vista"
  4. Use áreas de diálogo, etc (lo hace más fácil)
  5. Dígale al BuildManager que existe su DLL de complemento.

También necesita modificar el proveedor de ruta virtual para acceder a las vistas desde sus carpetas de complementos si desea poder modificar las vistas durante el tiempo de ejecución en Visual Studio. Cualquier cambio requeriría una reconstrucción del plugin DLL.

actualización

de Video en MVC2 (áreas MvC3 funciona de la misma): http://www.asp.net/mvc/videos/mvc-2/how-do-i/aspnet-mvc-2-areas

tenga en cuenta que el video es para áreas en el mismo proyecto. Tener áreas en bibliotecas de clases separadas es más complejo. La solución más fácil es usar las áreas portátiles como lo sugirió otra persona.

+0

cualquier documentación paso a paso de Microsoft sobre el uso de Areas para MVC 3? – user20358

+0

@ user20358: lee mi actualización. – jgauffin

+0

Gracias. Hará. – user20358

2

¿Por qué mantener solo sus vistas en el 'proyecto web principal'? Creo que se está perdiendo el sentido con MVC.

Son los controladores los que forman parte de su 'web principal'. Son lo que sus usuarios solicitan y vuelven a publicar, no la vista.

La vista está solo allí para proporcionar un medio para el diseño de HTML para que el controlador presione en el navegador.

Los modelos que creo que deberían ser realmente ViewModels, están ahí para proporcionar contenido (es decir, datos reales) para sus vistas.

Por lo tanto, puede ver que el diseño de MVC realmente quiere que los tres se agrupen sensiblemente. Los controladores interactúan con su usuario, obtienen la vista (el diseño) y la llenan con su ViewModel/Model (los datos). Esta es su interfaz de usuario, las tres partes de MVC (si usa el ViewModel de todos modos) son solo para UI.

De dónde provienen los datos, sus modelos reales y lo que quiera hacer con ellos pueden residir fácilmente en un dll en algún lugar o en el otro lado de un conjunto de servicios web o lo que sea.

+0

Así que digo que guardo las Vistas y los Controladores en el mismo proyecto web. Pero luego muevo los modelos a un proyecto de biblioteca de clases separado. Mi capa de acceso a datos en un proyecto de biblioteca de clases separado y la capa Business en un proyecto de biblioteca de clases separado. ¿Sería eso una buena práctica de su experiencia? Todavía estoy por probar Áreas ... pero odiaría pensar que es la única manera ... – user20358

+1

Mi política es nunca utilizar modelos de dominio real en la interfaz de usuario, solo uso ViewModels, que son modelos diseñados específicamente para la interfaz de usuario en lugar de modelos que cumplan con los requisitos de mi dominio.Estos modelos de vista no necesitan mapearse directamente a modelos de dominio, sino que eligen y eligen propiedades de los modelos de dominio para su visualización. Esto conduce a un poco de código de 'mapeo', pero puede usar Automapper para reducir esta carga. Los modelos de dominio ahora pueden estar en cualquier lugar, en una capa, en un servicio web, en otra tecnología en general. Las cosas que guardo en el proyecto web son vistas, controladores y modelos de vista ...... –

+1

.... continuación - de esa manera el proyecto web (vista, modelo de vista, controlador) es realmente lo que sea que UI quiera poner sobre mi dominio. Si quiero hacer algo diferente, como una aplicación móvil, tengo la opción de construir la interfaz de usuario móvil en el proyecto web O crear otro proyecto web para la aplicación móvil, aunque ambas aplicaciones aún usan los mismos servicios de dominio. No hay muchos ejemplos que utilicen el concepto viewmodel, que creo que conduce a que la interfaz de usuario y el dominio se vinculen demasiado. –