基於IoC的ControllerActivator
除了通過自定義ControllerFactory的方式引入IoC之外在使用默認DefaultControllerFactory情況下也可以通過一些擴展使基於IoC的Controller激活成為可能不過這就需要我們具體了解實現在DefaultControllerFactory內部的Controller激活機制了
DefaultControllerFactory針對目標Controller的激活其實是通過另一個名為ControllerActivator的組件來完成的所有的ControllerActivator實現了SystemWebMvc IControllerActivator接口如下面的代碼片段所示IControllerActivator定義了唯一的用於創建Controller對象的Create方法而DefaultControllerFactory使用的ControllerActivator可以直接通過構造函數參數的方式來指定
public interface IControllerActivator
{
IController Create(RequestContext requestContext Type controllerType)
}
public class DefaultControllerFactory : IControllerFactory
{
//其他成員
public DefaultControllerFactory()
public DefaultControllerFactory(IControllerActivator controllerActivator)
}
實例演示創建基於Ninject的ControllerActivator(S)
如果我們基於一個ControllerActivator對象來創建一個DefaultControllerFactory它最終會被用於Controller對象的激活那麼可以通過自定義ControllerActivator的方式將IoC引入Controller激活系統接下來自定義的ControllerActivtor基於另一個IoC框架Ninject較之UnityNinject是一個更加輕量級也更適合ASPNET MVC的IoC框架將自定義的ControllerActivator起名為NinjectControllerActivator如下面的代碼所示針對目標Controller的創建是通過一個StandardKernel對象來完成的為了方便實現類型的映射我們定義了一個泛型的Register方法
public class NinjectControllerActivator : IControllerActivator
{
public IKernel Kernel { get; private set; }
public NinjectControllerActivator()
{
thisKernel = new StandardKernel()
}
public IController Create(RequestContext requestContext Type controllerType)
{
return (IController)thisKernelTryGet(controllerType)
}
public void Register<TFrom TTo>() where TTo: TFrom
{
thisKernelBind<TFrom>()To<TTo>()
}
}
接下來我們使用的還是之前演示過的關於員工管理的例子前面我們演示了屬性注入的方式在激活EmployeeController的時候對Repository進行初始化現在來演示另一種依賴注入形式構造器注入如下面的代碼片段所示只讀的Repository是在構造函數中通過指定的參數初始化的而該參數的類型是IEmployeeRepository
[] []
From:http://tw.wingwit.com/Article/program/net/201311/16067.html