private static bool IsNamespaceMatch(string requestedNamespace
string targetNamespace)
{
if (!requestedNamespaceEndsWith(*
StringComparisonOrdinalIgnoreCase))
{
return stringEquals(requestedNamespace targetNamespace
StringComparisonOrdinalIgnoreCase)
}
requestedNamespacerequestedNamespace = requestedNamespaceSubstring(
requestedNamespaceLength *Length)
if (!targetNamespaceStartsWith(requestedNamespace
StringComparisonOrdinalIgnoreCase))
{
return false;
}
return ((requestedNamespaceLength == targetNamespaceLength) ||
(targetNamespace[requestedNamespaceLength] == ))
}
private Type GetControllerType(IEnumerable<string> namespaces
Type[] controllerTypes)
{
var types = (from type in controllerTypes
where namespacesAny(ns => IsNamespaceMatch(
ns typeNamespace))
select type)ToArray()
switch (typesLength)
{
case : return null;
case : return types[];
default: throw new InvalidOperationException(具有多个匹配的Controller
类型)
}
}
protected virtual Type GetControllerType(RouteData routeData
string controllerName)
{
//省略实现
}
}
如上面的代码片段所示ReflectedControllerFactory具有一个静态的controllerTypes字段用于保存所有被解析出来的Controller的类型在静态构造函数中调用BuildManager的GetReferencedAssemblies方法得到所有被引用的程序集并得到所有定义其中的实现了IController接口的类型这些类型全部被添加到通过静态字段controllerTypes表示的类型列表
Controller类型的解析实现在受保护的GetControllerType方法中在用于最终激活Controller对象的CreateController方法中通过调用该方法得到与指定RequestContext和Controller名称相匹配的Controller类型最终通过调用Activator的静态方法CreateInstance创建相应的Controller对象
ReflectedControllerFactory中定义了两个辅助方法其中IsNamespaceMatch用于判断Controller类型真正的命名空间是否与指定的命名空间(可能包含统配符)相匹配进行字符比较是忽略大小写的私有方法GetControllerType根据指定的命名空间列表和类型名称匹配的类型数组得到一个完全匹配的Controller类型如果得到多个匹配的类型直接抛出InvalidOperation异常并提示具有多个匹配的Controller类型如果找不到匹配类型则返回Null
返回目录ASPNET MVC 框架揭秘
编辑推荐
ASP NET开发培训视频教程
Microsoft NET框架程序设计视频教程
Java程序性能优化让你的Java程序更快更稳定
Visual C++音频/视频技术开发与实战
[] []