基於IoC的DependencyResolver()
上面介紹的類型DefaultControllerFactoryIControllerActivatorDefaultControllerActivatorIDependencyResolverDefaultDependencyResolver和DependencyResolver之前的關系基本上可以通過如圖所示的類圖來體現
圖 DefaultControllerFactory + ControllerActivator + DependencyResolver
實例演示創建基於Ninject的DependencyResolver(S)
通過前面的介紹我們知道當調用構造函數創建一個DefaultControllerFactory的時候如果調用的時候默認無參構造函數後者將作為參數的ControllerActivator對象設置為Null那麼默認請求用於激活Controller實例的是通過DependencyResolver類型的靜態屬性Current表示的DependencyResolver對象換言之我們可以通過自定義DependencyResolver的方式來實現基於IoC的Controller激活
同樣是采用Ninject我們定義了一個具有如下定義的NinjectDependencyResolver與上面定義的NinjectControllerActivator類似NinjectDependencyResolver具有一個IKernel類型的只讀屬性Kernel該屬性在構造函數中被初始化為一個StandardKernel對象對於實現的GetService和GetServices方法直接調用Kernel的TryGet和GetAll返回指定類型的實例和實例列表為了方便進行類型映射我們定義了泛型的Register<TFromTTo>方法
public class NinjectDependencyResolver : IDependencyResolver
{
public IKernel Kernel { get; private set; }
public NinjectDependencyResolver()
{
thisKernel = new StandardKernel()
}
public void Register<TFrom TTo>() where TTo: TFrom
{
thisKernelBind<TFrom>()To<TTo>()
}
public object GetService(Type serviceType)
{
return thisKernelTryGet(serviceType)
}
public IEnumerable<object> GetServices(Type serviceType)
{
return thisKernelGetAll(serviceType)
}
}
我們只需要創建一個自定義的NinjectDependencyResolver對象並將其作為當前的DependencyResolver即可如下面的代碼片段所示我們創建了一個NinjectDependencyResolver對象並注冊了IEmployeeRepository和EmployeeRepository之間的映射關系然後調用DependencyResolver的靜態方法SetResolver將創建的NinjectDependencyResolver注冊為當前的DependencyResolver對象再次運行我們的程序依然會得到如圖所示的效果
public class MvcApplication : SystemWebHttpApplication
{
//其他成員
protected void Application_Start()
{
//其他操作
NinjectDependencyResolver dependencyResolver =
new NinjectDependencyResolver()
dependencyResolverRegister<IEmployeeRepository EmployeeRepository>()
DependencyResolverSetResolver(dependencyResolver)
}
}
返回目錄ASPNET MVC 框架揭秘
編輯推薦
ASP NET開發培訓視頻教程
Microsoft NET框架程序設計視頻教程
Java程序性能優化讓你的Java程序更快更穩定
Visual C++音頻/視頻技術開發與實戰
From:http://tw.wingwit.com/Article/program/net/201311/16064.html