除自訂 ControllerFactory 外,預設 DefaultControllerFactory 亦可透過 IControllerActivator 與 IDependencyResolver 整合 IoC 容器。本文深入解析兩者關係、預設實現與替換策略。
public class DefaultControllerFactory : IControllerFactory
{
public DefaultControllerFactory();
public DefaultControllerFactory(IControllerActivator controllerActivator);
}
public interface IControllerActivator
{
IController Create(RequestContext requestContext, Type controllerType);
}
預設使用內部 DefaultControllerActivator,其建構子可注入 IDependencyResolver。
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)。
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 型別,即可實現依賴注入。
DependencyResolver.SetResolver(myResolver)Create 中從容器解析,new DefaultControllerFactory(myActivator)GetControllerInstance(舊版 API 相容)方式一最標準,支援 GetServices 多實例解析;方式二最輕量;方式三為 MVC 3 相容保留。