asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

ASP.NET MVC 4框架揭秘:Controller类型(1)[2]


发布日期:2021年03月05日
 
ASP.NET MVC 4框架揭秘:Controller类型(1)[2]

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++音频/视频技术开发与实战

[] []

               

上一篇:ASP.NET MVC 4框架揭秘:Controller类型(1)[1]

下一篇:ASP.NET MVC 4框架揭秘:Controller类型(2)[1]