ControllerBuilder()
用於激活Controller對象的ControllerFactory最終通過SystemWebMvcControllerBuilder注冊到ASPNET MVC應用中如下面的代碼所示ControllerBuilder定義了一個靜態只讀屬性Current返回當前ControllerBuilder對象這是針對整個Web應用的全局對象兩個SetControllerFactory方法重載用於注冊ControllerFactory的類型或者實例而GetControllerFactory方法返回一個具體的ControllerFactory對象
public class ControllerBuilder
{
public IControllerFactory GetControllerFactory()
public void SetControllerFactory(Type controllerFactoryType)
public void SetControllerFactory(IControllerFactory controllerFactory)
public HashSet<string> DefaultNamespaces { get; }
public static ControllerBuilder Current { get; }
}
具體來說如果我們注冊的是ControllerFactory的類型那麼GetControllerFactory在執行的時候會通過對注冊類型的反射(調用Activator的靜態方法CreateInstance)來創建具體的ControllerFactory(系統不會對創建的Controller進行緩存)如果注冊的是一個具體的ControllerFactory對象該對象直接從GetControllerFactory返回
通過第章URL路由的介紹我們知道被ASPNET路由系統進行攔截處理後會生成一個用於封裝路由信息的RouteData對象而目標Controller的名稱就包含在通過該RouteData的Values屬性表示的RouteValueDictionary對象中對應的Key為controller而在默認的情況下這個作為路由數據的名稱只能幫助我們解析出Controller的類型名稱如果在不同的命名空間下定義了多個同名的Controller類會導致激活系統無法確定具體的Controller的類型從而拋出異常
為了解決這個問題我們必須為定義了同名Controller類型的命名空間設置不同的優先級具體來說有兩種提升命名空間優先級的方式第一種方式就是在調用RouteCollection如下所示的擴展方法MapRoute時指定一個命名空間的列表通過第章URL路由的介紹我們知道通過這種方式指定的命名空間列表會保存在Route對象的DataTokens屬性表示的RouteValueDictionary字典中對應的Key為Namespaces
public static class RouteCollectionExtensions
{
//其他成員
public static Route MapRoute(this RouteCollection routes string name
string url string[] namespaces)
public static Route MapRoute(this RouteCollection routes string name
string url object defaults string[] namespaces)
public static Route MapRoute(this RouteCollection routes string name
string url object defaults object constraints string[] namespaces)
}
另一種提升命名空間優先級的方式就是將其添加到當前的ControllerBuilder中的默認命名空間列表中從上面的給出的ControllerBuilder的定義可以看出它具有一個HashSet<string>類型的只讀屬性DefaultNamespaces代表了這麼一個默認命名空間列表對於這兩種不同的命名空間優先級提升方式前者(通過路由注冊)指定命名空間具有更高的優先級
實例演示如何提升命名空間的優先級(SSS)
[] []
From:http://tw.wingwit.com/Article/program/net/201311/16094.html