熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP.NET MVC 4框架揭秘:基於IoC的DependencyResolver(1)[1]

2013-11-13 12:30:56  來源: .NET編程 

    基於IoC的DependencyResolver(

  如果在構建DefaultControllerFactory的時候沒有顯式指定采用ControllerActivator它默認使用的是一個類型為DefaultControllerActivator的對象如下面的代碼片段所示這只是一個實現了IControllerActivator接口的私有類型不能直接通過編程的方式使用它

  private class DefaultControllerActivator : IControllerActivator

  {

  public DefaultControllerActivator()

  public DefaultControllerActivator(IDependencyResolver resolver)

  public IController Create(RequestContext requestContext

  Type controllerType)

  }

  即使DefaultControllerFactory采用了默認的DefaultControllerActivator依然可以將IoC引入到Controller的激活系統中而這就需要進一步了解實現在DefaultControllerActivator的Controller激活邏輯了

  其實DefaultControllerActivator完成對Controller的激活依賴於另一個名為DependencyResolver的對象DependencyResolver是一個非常重要的組件可以將其視為ASPNET MVC框架內部使用的IoC容器它不只是用於針對Controller的激活框架內部很多組件的提供最終都依賴於它DependencyResolver實現了具有如下定義的SystemWebMvcIDependencyResolver接口GetService和GetServices方法分別用於根據指定的類型獲取單個和所有實例

  public interface IDependencyResolver

  {

  object GetService(Type serviceType)

  IEnumerable<object> GetServices(Type serviceType)

  }

  整個Web默認使用的DependencyResolver可以通過SystemWebMvcDependency Resolver類型進行注冊如下面的代碼片段所示DependencyResolver類型具有一個靜態的Current屬性表示當前DependencyResolver具體對DependencyResolver的注冊通過調用靜態方法SetResolver來完成順便說一下DependencyResolver類型並沒有實現IDependencyResolver接口並不是真正意義上的DependencyResolver

  public class DependencyResolver

  {

  //其他成員

  private static DependencyResolver _instance;

  public void InnerSetResolver(object commonServiceLocator)

  public void InnerSetResolver(IDependencyResolver resolver)

  public void InnerSetResolver(Func<Type object> getService

  Func<Type IEnumerable<object》 getServices)

  public static void SetResolver(object commonServiceLocator)

  public static void SetResolver(IDependencyResolver resolver)

  public static void SetResolver(Func<Type object> getService

  Func<Type IEnumerable<object》 getServices)

  public static IDependencyResolver Current { get; }

  public IDependencyResolver InnerCurrent { get; }

  }

  這個被封裝的DependencyResolver(指實現了接口IDependencyResolver的某個類型的對象不是指DependencyResolver類型的對象對於後者我們會采用DependencyResolver類型對象的說法)通過只讀屬性InnerCurrent表示而三個InnerSetResolver方法重載用於初始化該屬性靜態字段_instance表示當前的DependencyResolver類型對象靜態只讀屬性Current則表示該對象內部封裝的DependencyResolver對象而它通過三個靜態的SetResolver進行初始化

[]  []  


From:http://tw.wingwit.com/Article/program/net/201311/16065.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.