J'ai décidé de creuser un peu plus loin et j'ai trouvé exactement ce que je cherchais après avoir cherché dans le code source du MVC. La convention pour les noms de contrôleur est profondément dans les racines de la MVC Framework, en particulier dans deux classes ControllerDescriptor
et ControllerTypeCache
.
En ControllerDescriptor
il est donné par l'attribut suivant:
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
il est donné par les méthodes suivantes:
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);
}
}
}