首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET MVC Controller 激活系統詳解(下):ControllerActivator 與 DependencyResolver 整合 IoC

     編輯:關於ASP.NET

除自訂 ControllerFactory 外,預設 DefaultControllerFactory 亦可透過 IControllerActivator 與 IDependencyResolver 整合 IoC 容器。本文深入解析兩者關係、預設實現與替換策略。

一、DefaultControllerFactory 與 IControllerActivator

public class DefaultControllerFactory : IControllerFactory
{
    public DefaultControllerFactory();
    public DefaultControllerFactory(IControllerActivator controllerActivator);
}

public interface IControllerActivator
{
    IController Create(RequestContext requestContext, Type controllerType);
}

預設使用內部 DefaultControllerActivator,其建構子可注入 IDependencyResolver。

二、IDependtyResolver 與 DependencyResolver 封裝類

public interface IDependencyResolver
{
    object GetService(Type serviceType);
    IEnumerable<object> GetServices(Type serviceType);
}

public class DependencyResolver
{
    public static IDependencyResolver Current { get; }
    public static void SetResolver(IDependencyResolver resolver);
    public static void SetResolver(Func<Type, object> getService, Func<Type, IEnumerable<object>> getServices);
    // 內部封裝欄位 _instance, InnerCurrent 等
}

DependencyResolver 為靜態門面類,封裝真正的 IDependencyResolver 實作。未顯式設定時,Current 回傳 DefaultDependencyResolver(反射建立實例,介面/抽象類別回傳 null)。

三、DefaultControllerActivator 實現

private class DefaultControllerActivator : IControllerActivator
{
    public DefaultControllerActivator(IDependencyResolver resolver);
    public IController Create(RequestContext requestContext, Type controllerType)
    {
        return (IController)resolver.GetService(controllerType);
    }
}

核心邏輯:委派 IDependencyResolver.GetService(controllerType) 取得 Controller 實例。若 IoC 容器已註冊 Controller 型別,即可實現依賴注入。

四、整合 IoC 容器三種方式

  1. 實作 IDependencyResolver:包裝 Unity/Autofac/Ninject 等容器,DependencyResolver.SetResolver(myResolver)
  2. 自訂 IControllerActivator:直接在 Create 中從容器解析,new DefaultControllerFactory(myActivator)
  3. 繼承 DefaultControllerFactory:覆寫 GetControllerInstance(舊版 API 相容)

方式一最標準,支援 GetServices 多實例解析;方式二最輕量;方式三為 MVC 3 相容保留。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved