2010-06-10 27 views
8

¿Hay alguna manera de cambiar la convención de nomenclatura para los controladores en ASP.NET MVC?cambie la convención del nombre del controlador en ASP.NET MVC

Lo que yo quiero es a nombre de mis controladores InicioControlador en lugar de InicioController, o mejor aún, utilizar un prefijo en lugar de un sufijo, y tienen ControladorInicio como mi nombre de controlador.

Por lo que he leído hasta ahora, creo que tengo que implementar mi propio Controller Factory. Estaría muy agradecido si alguno de ustedes pudiera señalarme en la dirección correcta.

Respuesta

5

Sí, ControllerFactory es la mejor solución a su problema.

public IController CreateController(RequestContext requestContext, string controllerName) 
    {    
     BaseController controller; 

     switch (controllerName.ToLower()) 
     { 
      case "product": case "products": controller = new MyProductController(); break; 
      case "home": controller = new MyHomeController(); break; 
      case "account": controller = new MyAccountController(); break; 
      default: controller = null; break; 
     } 

     return controller; 
    } 

Ésta es mi primera ControllerFactory - pero es muy tonto :) Debe utilizar la reflexión y evitar este interruptor feo.

13

Decidí cavar un poco más profundo y encontré exactamente lo que estaba buscando después de buscar a través del código fuente de MVC. La convención para los nombres de los controladores se encuentra en las raíces de MVC Framework, específicamente en dos clases ControllerDescriptor y ControllerTypeCache.

En ControllerDescriptor es dada por la siguiente atributo:

public virtual string ControllerName { 
    get { 
    string typeName = ControllerType.Name; 
    if (typeName.EndsWith("Controller", StringComparison.OrdinalIgnoreCase)) { 
     return typeName.Substring(0, typeName.Length - "Controller".Length); 
    } 
    return typeName; 
    } 
} 

En ControllerTypeCache es dado por los siguientes métodos:

internal static bool IsControllerType(Type t) { 
    return 
    t != null && 
    t.IsPublic && 
    t.Name.EndsWith("Controller", StringComparison.OrdinalIgnoreCase) && 
    !t.IsAbstract && 
    typeof(IController).IsAssignableFrom(t); 
} 

public void EnsureInitialized(IBuildManager buildManager) 
{ 
    if (_cache == null) 
    { 
    lock (_lockObj) 
    { 
     if (_cache == null) 
     { 
     List<Type> controllerTypes = TypeCacheUtil.GetFilteredTypesFromAssemblies(_typeCacheName, IsControllerType, buildManager); 
     var groupedByName = controllerTypes.GroupBy(
      t => t.Name.Substring(0, t.Name.Length - "Controller".Length), 
      StringComparer.OrdinalIgnoreCase); 
     _cache = groupedByName.ToDictionary(
      g => g.Key, 
      g => g.ToLookup(t => t.Namespace ?? String.Empty, StringComparer.OrdinalIgnoreCase), 
      StringComparer.OrdinalIgnoreCase); 
     } 
    } 
    } 
Cuestiones relacionadas