2011-03-21 24 views
18

Estoy intentando configurar una solución MVC3 usando áreas, pero quiero tener mis áreas en diferentes ensamblajes. Por ejemplo, quiero un ensamblaje principal que contenga recursos compartidos como páginas maestras, hojas de estilo, scripts, página de inicio de sesión, etc. Pero quiero áreas distintas de funcionalidad comercial en ensamblajes separados.ASP.NET MVC3 - Áreas en ensamblajes separados

He intentado este ejemplo que se escribió para la vista previa de MVC2: http://msdn.microsoft.com/en-us/library/ee307987%28VS.100%29.aspx. (Nota, originalmente encontré esto de este hilo de desbordamiento de pila: ASP.NET MVC - separating large app). Pero parece que MVC3 no tiene la opción de mover archivos de vista al proyecto principal. No estoy loco por usar la opción resource/VirtualPathProvider incrustada.

¿Alguna sugerencia sobre cómo hacer que esto funcione con MVC3?

Gracias, Saltar

+0

Esta publicación de SO es probablemente una mejor solución para usted: http://stackoverflow.com/questions/4241399/asp-net-mvc-3-rc-arearegistration-registerallareas-and-dynamically-loaded-assem – gidmanma

Respuesta

2

Puede separar sus controladores y vistas sin el uso de áreas. Para los controladores, puede usar Windsor o cualquier otro contenedor IoC para resolver los controladores de diferentes conjuntos. Por ejemplo, usted puede registrar todos los controladores de esta manera:

container.Register(AllTypes.FromAssemblyInDirectory(new AssemblyFilter(HttpRuntime.BinDirectory)).BasedOn<IController>().Configure(c => c.LifeStyle.Transient)); 

También usted tiene que poner en práctica IDependencyResolver a continuación, establecer DependencyResolver.SetResolver (...).

Para los puntos de vista, tiene dos opciones:

  1. recursos embebidos y VirtualPathProvider
  2. simple copia los archivos de vista a la ubicación adecuada tras la compilación/desplegar

se construyó un marco sencillo (similar a Portable Areas) utilizando Windsor y vistas de recursos integrados proporcionados por una implementación VirutalPathProvider.

+0

Esto es código en GitHub por casualidad? – cecilphillip

+0

Lo siento, pero no puedo compartir ese código ya que pertenece a mi empleado anterior. Por cierto, puedo decirles que finalmente eliminamos las vistas incrustadas, pero los controladores permanecieron en ensamblajes separados. ¿Qué parte específica de esta solución le interesa? –

+0

Vistas incrustadas y virtualPathProvider – cecilphillip

2

Puede usar MvcContrib with Portable Areas, pero de esta manera tendría vistas incrustadas.

Solo crea un MVC y un proyecto de biblioteca de clase. Cree su área en el proyecto MVC y, una vez que haya terminado, mueva todo excepto las Vistas desde el área a la biblioteca de clases.

Utilice NuGet para obtener este paquete y puede usar su nueva área NuGet en cada proyecto MVC.

11

1 - Separa le Áreas MVC MVC en proyectos diferentes jinetes que se recopilarán en sus propias asambleas separadas

2 - Añade esto a su AssemblyInfo.clase cs, para llamar a un método cuando la aplicación se carga

[assembly: PreApplicationStartMethod(typeof(PluginAreaBootstrapper), "Init")] 

3 - Esto es lo que el método Init parece cuando se invoca durante la carga

public class PluginAreaBootstrapper 
{ 
    public static readonly List<Assembly> PluginAssemblies = new List<Assembly>(); 

    public static List<string> PluginNames() 
    { 
     return PluginAssemblies.Select(
      pluginAssembly => pluginAssembly.GetName().Name) 
      .ToList(); 
    } 

    public static void Init() 
    { 
     var fullPluginPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Areas"); 

     foreach (var file in Directory.EnumerateFiles(fullPluginPath, "*Plugin*.dll")) 
      PluginAssemblies.Add(Assembly.LoadFile(file)); 

     PluginAssemblies.ForEach(BuildManager.AddReferencedAssembly); 
    } 
} 

4 - Añadir una RazorViewEngine encargo

public class PluginRazorViewEngine : RazorViewEngine 
{ 
    public PluginRazorViewEngine() 
    { 
     AreaMasterLocationFormats = new[] 
     { 
      "~/Areas/{2}/Views/{1}/{0}.cshtml", 
      "~/Areas/{2}/Views/{1}/{0}.vbhtml", 
      "~/Areas/{2}/Views/Shared/{0}.cshtml", 
      "~/Areas/{2}/Views/Shared/{0}.vbhtml" 
     }; 

     AreaPartialViewLocationFormats = new[] 
     { 
      "~/Areas/{2}/Views/{1}/{0}.cshtml", 
      "~/Areas/{2}/Views/{1}/{0}.vbhtml", 
      "~/Areas/{2}/Views/Shared/{0}.cshtml", 
      "~/Areas/{2}/Views/Shared/{0}.vbhtml" 
     }; 

     var areaViewAndPartialViewLocationFormats = new List<string> 
     { 
      "~/Areas/{2}/Views/{1}/{0}.cshtml", 
      "~/Areas/{2}/Views/{1}/{0}.vbhtml", 
      "~/Areas/{2}/Views/Shared/{0}.cshtml", 
      "~/Areas/{2}/Views/Shared/{0}.vbhtml" 
     }; 

     var partialViewLocationFormats = new List<string> 
     { 
      "~/Views/{1}/{0}.cshtml", 
      "~/Views/{1}/{0}.vbhtml", 
      "~/Views/Shared/{0}.cshtml", 
      "~/Views/Shared/{0}.vbhtml" 
     }; 

     var masterLocationFormats = new List<string> 
     { 
      "~/Views/{1}/{0}.cshtml", 
      "~/Views/{1}/{0}.vbhtml", 
      "~/Views/Shared/{0}.cshtml", 
      "~/Views/Shared/{0}.vbhtml" 
     }; 

     foreach (var plugin in PluginAreaBootstrapper.PluginNames()) 
     { 
      masterLocationFormats.Add(
       "~/Areas/" + plugin + "/Views/{1}/{0}.cshtml"); 
      masterLocationFormats.Add(
       "~/Areas/" + plugin + "/Views/{1}/{0}.vbhtml"); 
      masterLocationFormats.Add(
       "~/Areas/" + plugin + "/Views/Shared/{1}/{0}.cshtml"); 
      masterLocationFormats.Add(
       "~/Areas/" + plugin + "/Views/Shared/{1}/{0}.vbhtml"); 

      partialViewLocationFormats.Add(
       "~/Areas/" + plugin + "/Views/{1}/{0}.cshtml"); 
      partialViewLocationFormats.Add(
       "~/Areas/" + plugin + "/Views/{1}/{0}.vbhtml"); 
      partialViewLocationFormats.Add(
       "~/Areas/" + plugin + "/Views/Shared/{0}.cshtml"); 
      partialViewLocationFormats.Add(
       "~/Areas/" + plugin + "/Views/Shared/{0}.vbhtml"); 

      areaViewAndPartialViewLocationFormats.Add(
       "~/Areas/" + plugin + "/Views/{1}/{0}.cshtml"); 
      areaViewAndPartialViewLocationFormats.Add(
       "~/Areas/" + plugin + "/Views/{1}/{0}.vbhtml"); 
      areaViewAndPartialViewLocationFormats.Add(
       "~/Areas/" + plugin + "/Areas/{2}/Views/{1}/{0}.cshtml"); 
      areaViewAndPartialViewLocationFormats.Add(
       "~/Areas/" + plugin + "/Areas/{2}/Views/{1}/{0}.vbhtml"); 
      areaViewAndPartialViewLocationFormats.Add(
       "~/Areas/" + plugin + "/Areas/{2}/Views/Shared/{0}.cshtml"); 
      areaViewAndPartialViewLocationFormats.Add(
       "~/Areas/" + plugin + "/Areas/{2}/Views/Shared/{0}.vbhtml"); 
     } 

     ViewLocationFormats = partialViewLocationFormats.ToArray(); 
     MasterLocationFormats = masterLocationFormats.ToArray(); 
     PartialViewLocationFormats = partialViewLocationFormats.ToArray(); 
     AreaPartialViewLocationFormats = areaViewAndPartialViewLocationFormats.ToArray(); 
     AreaViewLocationFormats = areaViewAndPartialViewLocationFormats.ToArray(); 
    } 
} 

5 - Registro de sus áreas diferentes de su MVC (Zona) Proyectos

namespace MvcApplication8.Web.MyPlugin1 
{ 
    public class MyPlugin1AreaRegistration : AreaRegistration 
    { 
     public override string AreaName 
     { 
      get { return "MyPlugin1"; } 
     } 

     public override void RegisterArea(AreaRegistrationContext context) 
     { 
      context.MapRoute(
       "MyPlugin1_default", 
       "MyPlugin1/{controller}/{action}/{id}", 
       new {action = "Index", id = UrlParameter.Optional} 
       ); 
     } 
    } 
} 

código fuente y referencias adicionales se pueden encontrar aquí: http://blog.longle.io/2012/03/29/building-a-composite-mvc3-application-with-pluggable-areas/

+0

¿Puede informarme si esto también funciona con páginas aspx? – Saravanan

0

Ver this article de cómo crear un proyecto que funciona como un área dentro de otra aplicación MVC. Básicamente, los archivos en el proyecto del área viven bajo la carpeta Area en el proyecto principal, pero no se incluyen como parte del proyecto principal (no se hace referencia en el archivo del proyecto).