基於IoC的ControllerFactory()
ASPNET MVC的Controller激活系統最終通過ControllerFactory來創建目標Controller對象要將IoC引入ASPNET MVC並通過對應的IoC容器實現對目標Controller的激活我們很自然地會想到自定義一個基於IoC的ControllerFactory
對於自定義ControllerFactory可以直接實現IControllerFactory接口創建一個全新的ControllerFactory類型這需要實現包括Controller類型的解析Controller實例的創建與釋放以及會話狀態行為選項的獲取在內的所有功能一般來說Controller實例的創建才需要IoC容器的控制為了避免重新實現其他的功能可以直接繼承DefaultControllerFactory重寫Controller實例創建的邏輯
實例演示創建基於Unity的ControllerFactory(S)
現在我們通過一個簡單的實例演示如何通過自定義ControllerFactory利用Unity進行Controller的激活為了避免針對Controller類型解析會話狀態行為選項的獲取和對Controller對象的釋放邏輯的重復定義我們直接繼承DefaultControllerFactory將該自定義ControllerFactory命名為UnityControllerFactory如下面的代碼片段所示UnityControllerFactory僅僅重寫了受保護的虛方法GetControllerInstance將成功解析的Controller類型作為調用UnityContainer的Resolve方法的參數而返回值就是需要被激活的Controller實例
public class UnityControllerFactory: DefaultControllerFactory
{
public IUnityContainer UnityContainer { get; private set; }
public UnityControllerFactory(IUnityContainer unityContainer)
{
thisUnityContainer = unityContainer;
}
protected override IController GetControllerInstance(
RequestContext requestContext Type controllerType)
{
if (null == controllerType)
{
return null;
}
return (IController)thisUnityContainerResolve(controllerType)
}
}
整個自定義的UnityControllerFactory就這麼簡單為了演示IoC在它身上的體現我們在一個簡單的ASPMVC實例中來使用它我們沿用在第章URL路由中使用過的關於員工管理的場景如圖所示本實例由兩個頁面(對應著兩個View)組成一個用於顯示員工列表另一個用於顯示基於某個員工的詳細信息
圖 員工列表和員工詳細信息頁面
[] []
From:http://tw.wingwit.com/Article/program/net/201311/16073.html