ASP.NET MVC, , , , - . .
ASP.NET MVC ControllerTypeCache , . "MVC-ControllerTypeCache.xml" .
internal sealed class ControllerTypeCache
{
private const string TypeCacheName = "MVC-ControllerTypeCache.xml";
...
}
ControllerTypeCache:
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);
}
}
}
}
, TypeCacheUtil.GetFilteresTypesFromAssemblies. :
public static List<Type> GetFilteredTypesFromAssemblies(string cacheName, Predicate<Type> predicate, IBuildManager buildManager)
{
TypeCacheSerializer serializer = new TypeCacheSerializer();
List<Type> matchingTypes = ReadTypesFromCache(cacheName, predicate, buildManager, serializer);
if (matchingTypes != null)
{
return matchingTypes;
}
matchingTypes = FilterTypesInAssemblies(buildManager, predicate).ToList();
SaveTypesToCache(cacheName, matchingTypes, buildManager, serializer);
return matchingTypes;
}
, . (, ), .
ReadTypesFromCache :
internal static List<Type> ReadTypesFromCache(string cacheName, Predicate<Type> predicate, IBuildManager buildManager, TypeCacheSerializer serializer)
{
try
{
Stream stream = buildManager.ReadCachedFile(cacheName);
if (stream != null)
{
using (StreamReader reader = new StreamReader(stream))
{
List<Type> deserializedTypes = serializer.DeserializeTypes(reader);
if (deserializedTypes != null && deserializedTypes.All(type => TypeIsPublicClass(type) && predicate(type)))
{
return deserializedTypes;
}
}
}
}
catch
{
}
return null;
}
, BuildManager.
, , . DefaultControllerFactory AreaRegistration.
, , , , GetFilteredTypesFromAssemblies TypeCacheUtil . , . BuildManager , , , , .
- , , , MVC-ControllerTypeCache.xml - Global.asax Web.Config .
? , , , , , . . - , , "" .NET , MVC-ControllerTypeCache.xml. , - .