Proporcionar o filtrar conjuntos al registrar áreas para una aplicación MVC 2.0 de ASP.NET

Tengo una aplicación grande que actualmente existe como un híbrido de WebForms y MVC 2.0. El inicio de mi aplicación es terrible, y el culpable se debe principalmente a la llamada AreaRegistration.RegisterAllAreas . Más específicamente, que está utilizando el System.Web. Comstacktion.BuildManager.GetReferencedAssemblies System.Web. Comstacktion.BuildManager.GetReferencedAssemblies para enumerar todos los tipos en ensamblajes directamente referenciados por la aplicación y probarlos para ver si se derivan de AreaRegistration .

Desafortunadamente, tengo varios ensamblajes de terceros que resultan ser bastante extensos, por lo que esta carga inicial puede ser bastante mala. Tendría resultados mucho mejores si pudiera decirle qué ensamblajes buscar AreaRegistrations de AreaRegistrations , o incluso registrar áreas manualmente por el momento.

Puedo recostackr todos los elementos internos de AreaRegistration para crear e invocar el registro, pero tengo curiosidad si otros han tenido y trabajado en este problema.

Reuní la siguiente utilidad para aislar ensamblajes para registrar áreas. Tuve que cortar los registros internos del área, pero no parecen ser muy complicados y esto ha funcionado razonablemente bien para mí:

 using System; using System.Linq; using System.Reflection; using System.Web.Mvc; using System.Web.Routing; namespace MyCompany.Web.Mvc { ///  /// Provides helpful utilities for performing area registration, where  may not suffice. ///  public static class AreaRegistrationUtil { ///  /// Registers all areas found in the assembly containing the given type. ///  /// A type that derives from  and has a default constructor. public static void RegisterAreasForAssemblyOf() where T : AreaRegistration, new() { RegisterAreasForAssemblyOf(null); } ///  /// Registers all areas found in the assembly containing the given type. ///  /// A type that derives from  and has a default constructor. /// An object containing state that will be passed to the area registration. public static void RegisterAreasForAssemblyOf(object state) where T : AreaRegistration, new() { RegisterAreasForAssemblies(state, typeof (T).Assembly); } ///  /// Registers all areas found in the given assemblies. ///  ///  objects containing the prospective area registrations. public static void RegisterAreasForAssemblies(params Assembly[] assemblies) { RegisterAreasForAssemblies(null, assemblies); } ///  /// Registers all areas found in the given assemblies. ///  /// An object containing state that will be passed to the area registration. ///  objects containing the prospective area registrations. public static void RegisterAreasForAssemblies(object state, params Assembly[] assemblies) { foreach (Type type in from assembly in assemblies from type in assembly.GetTypes() where IsAreaRegistrationType(type) select type) { RegisterArea((AreaRegistration) Activator.CreateInstance(type), state); } } ///  /// Performs area registration using the specified type. ///  /// A type that derives from  and has a default constructor. public static void RegisterArea() where T : AreaRegistration, new() { RegisterArea(null); } ///  /// Performs area registration using the specified type. ///  /// A type that derives from  and has a default constructor. /// An object containing state that will be passed to the area registration. public static void RegisterArea(object state) where T : AreaRegistration, new() { var registration = Activator.CreateInstance(); RegisterArea(registration, state); } private static void RegisterArea(AreaRegistration registration, object state) { var context = new AreaRegistrationContext(registration.AreaName, RouteTable.Routes, state); string ns = registration.GetType().Namespace; if (ns != null) context.Namespaces.Add(string.Format("{0}.*", ns)); registration.RegisterArea(context); } ///  /// Returns whether or not the specified type is assignable to . ///  /// A . /// True if the specified type is assignable to ; otherwise, false. private static bool IsAreaRegistrationType(Type type) { return (typeof (AreaRegistration).IsAssignableFrom(type) && (type.GetConstructor(Type.EmptyTypes) != null)); } } } 

La forma más fácil de usar esto, para mí, es

 AreaRegistrationUtil.RegisterAreasForAssemblyOf(); 

Esto ha hecho notables mejoras en el tiempo de inicio, a costa de no poder caer en un área y hacer que la aplicación la registre automáticamente. Sin embargo, eso no es una preocupación mía en este caso.

No estoy 100% seguro de que esto sea de ayuda en este caso específico, pero podría combinar todas las DLL de terceros en una DLL (por lo tanto, eliminar el procesamiento de todos los archivos individuales). Esto es lo que hemos hecho usando ILMerge en el momento de la comstackción. Funciona de maravilla. Todavía tendrá que mirar los metadatos de la dll (que ahora será un poco más grande) pero no tendrá que hacer tanto IO.