2010-05-19 15 views
13

Mi pregunta es similar a "ASP.NET 2 projects to share same files", pero con una inclinación ASP.NET MVC.Cómo hacer que un sitio ASP.NET MVC "derive" desde otro

Básicamente, tenemos dos sitios, uno basado principalmente en el otro (aproximadamente 90% de vistas, controladores, imágenes, en el segundo son idénticos al primero). Sin embargo, en algunos casos, las vistas pueden ser diferentes, o un controlador en el segundo sitio puede ser diferente al primero.

¿Hay alguna manera simple de lograr esto en ASP.NET MVC?

Hasta ahora, hemos analizado el uso de archivos vinculados para tener dos proyectos totalmente separados donde el segundo proyecto comparte los archivos que necesita desde el principio.

Un problema con este enfoque es que la mayoría de las páginas del segundo proyecto no existen literalmente en el directorio virtual, hace que la depuración sea dolorosa; tiene que publicar para generar los archivos y poder depurarlos.

¿Alguien tiene mejores enfoques o formas de simplificar este enfoque?

Respuesta

6

Este artículo podría ayudar: http://dotnetslackers.com/articles/aspnet/storing-asp-net-mvc-controllers-views-in-separate-assemblies.aspx

En esencia, se trata de la creación de su propia WebFormViewEngine que cuenta MVC dónde buscar las Vistas.

+1

Gracias Dan :) Este artículo parece que bien puede estar en la dirección correcta. Lo leeré y lo asimilaré de inmediato. –

+0

Por el momento, al menos a corto plazo, estamos compartiendo nuestros archivos fuente (vinculándolos) entre nuestros dos proyectos. Los cambios a WebFormViewEngine en este artículo nos han dado ideas de cómo solucionar algunos de los problemas que teníamos con respecto a la depuración y otras cosas. Gracias por eso Dan. –

4

Si son 90% el mismo y desea mantenerlos sincronizados a medida que evoluciona la funcionalidad, consideraría convertirlos en una única aplicación web y usar el encabezado de host para diferenciar y cambiar las imágenes/enlaces/texto/funcionalidad/etc. entre los dos sitios.

Puede hacer esto en su BaseController: observe el encabezado del host y cree un objeto Brand al que todas las páginas y vistas tienen acceso, al igual que podría tener un objeto User. Ese objeto Brand puede incluir el nombre del sitio, la URL canónica del sitio, la ubicación del directorio de imágenes para esa marca, valores booleanos para activar o desactivar ciertas funciones ...

Ahora en un controlador solo puede pedir if (Brand.SupportsPageX) {...} para decidir qué mostrar a continuación. Y si convierte el objeto de marca en parte de su modelo de vista base o lo coloca en la colección de vistas, puede tener vistas que usen el nombre de la marca, el directorio de imágenes ... para personalizar su apariencia.

2
  1. Ponga tanto como sea posible en un proyecto de biblioteca compartido no UI. Lo hago en cada proyecto en el que trabajo, aumento de la capacidad de prueba, código compartido con los Servicios de Windows y una serie de otras razones.

    He descubierto que si eres agresivo con esto, a menudo más de dos tercios del proyecto estaría en la biblioteca compartida no UI.

    Después de hacer esto, puede llevar las cosas un paso más allá y crear una segunda biblioteca con algunos elementos MVC/UI compartidos.

  2. Según su opinión al respecto, RenderAction puede ayudar un poco aquí. Como sabe, RenderAction le permitirá agrupar esos componentes de controlador/vista y pasar argumentos variables en el tiempo de ejecución.

2

Un proyecto que estoy trabajando actualmente con un requisito similar y hemos empezado a buscar en el uso de portable areas. Personalmente no los he profundizado mucho en este momento, pero puede valer la pena echarles un vistazo.

+0

Esto se ve muy interesante, gracias. –

2

He estado trabajando con áreas para crear varios sitios web que puedo alojar con una sola cuenta de hosting. Creo que podrías usar un enfoque similar. Al implementar la funcionalidad común en el proyecto base, estará disponible para cada área. También puede anular cualquiera de las vistas base o controladores al implementarlos en el área. Puede requerir algunos ajustes del ViewEngine y el enrutamiento, pero creo que se podría hacer.

+0

Gracias por la información. He echado un vistazo más de cerca a estas áreas, y ciertamente es interesante. No estoy seguro de poder ver cómo usarlo para dividir mis sitios en dlls separados (parece que las áreas en MVC están destinadas a subdividir un único sitio en un solo ensamblaje), pero sin embargo, ha sido interesante leer más alrededor de esta área (perdón por el juego de palabras)! –

Cuestiones relacionadas