中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在ASP.NET中利用MVC實現依賴注入

發布時間:2021-05-14 17:20:55 來源:億速云 閱讀:113 作者:Leah 欄目:開發技術

怎么在ASP.NET中利用MVC實現依賴注入?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

1.使用自動注入場景分析

在asp.net mvc中,無論是什么代碼邏輯分層,最終的表現層為Controller層,所以我們注入點就是在Controller中,這里我們需要替換默認的ControllerFactory,掃描代碼中標記需要注入的對象,進行實例化注入

public class FastControllerFactory : DefaultControllerFactory
  {
    public override IController CreateController(RequestContext requestContext, string controllerName)
    {
      Type type = this.GetControllerType(requestContext, controllerName);
      Object obj = GetControllerInstance(requestContext, type);

      //Controller中標記AutoWired屬性的自動注入
      List<FieldInfo> AutoWiredFieldList = type.GetRuntimeFields().Where(f => f.GetCustomAttribute(typeof(AutoWired)) != null).ToList();
      foreach (FieldInfo field in AutoWiredFieldList)
      {
        field.SetValue(obj, InjectUtil.Container.Resolve(field.FieldType));
      }
      return obj as IController;
    }
  }

FastControllerFactory就是我們自定義的一個Controller工廠,重寫CreateController方法,對標記了AutoWired這個自定義注解的變量,從Bean容器中取出實例進行賦值,同時我們還需要在Global文件中的Start方法中,進行默認工廠進行替換

ControllerBuilder.Current.SetControllerFactory(new FastControllerFactory());

2.IOC容器的實現

c#中的自定義容器有很多開源成熟的框架,例如AutoFac等,這里我們是自己實現一個輕量級的版本

源碼地址:https://gitee.com/grassprogramming/FastIOC

這里就重點說一下如何在asp.net mvc中的使用,首先我們需要對需要注入的Bean對象進行標記,這個標記就叫做Component,

在asp.net mvc Global文件中的Start方法中,我們需要將整個項目中需要自動注入的Bean加入到容器中

public class InjectUtil
  {
    public static ContainerBuilder Container;
    public static void Init()
    {
      Container = new ContainerBuilder();
       //獲取所有程序集
      var assemblies = System.Web.Compilation.BuildManager.GetReferencedAssemblies().Cast<Assembly>().ToArray();
      //注入所有Component組件
      Container.RegisterAssemblyTypes(assemblies, typeof(Component),true);
      Container.Build();
    }
  }

到這里Controller層面的事項就已經完成了,接下來就需要在IOC容器中初始化Bean實例方法中進一步處理

private Object GetInstance(RegisterEntity Entity)
    {
      Object obj = null;
      if (Entity.IsEnableIntercept)
      {
        bool IsExtend = Entity.RealType == Entity.RegistType;
        obj = DynamictProxy.CreateProxyObject(Entity.RealType, Entity.RegistType, Entity.InterceptType, IsExtend, Entity.IsInterceptAllMethod);


      }
      else
      {
        var constructors = Entity.RegistType.GetConstructors();
        obj = constructors[0].Invoke(new Object[] { });
      }
      //這里使用單例模式將實例化Instance存儲,提前暴露未進行后續設置的對象實例
      if (!SingleInstanceDic.ContainsKey(Entity.RealType))
      {
        SingleInstanceDic.Add(Entity.RealType, obj);
      }
    
      //如果這個class標記了Component,且有標記了AutoWired的Field,進行自動注入
      if (Entity.RealType.GetCustomAttribute(typeof(Component), true) != null)
      {
        //這里要使用GetRuntimeFields,此方法返回在指定類型上定義的所有字段,包括繼承,非公共,實例和靜態字段。
        foreach (FieldInfo Field in Entity.RealType.GetRuntimeFields())
        {
          if (Field.GetCustomAttribute(typeof(AutoWired), true) != null)
          {
            Type FieldType = Field.FieldType;
            if (Contains(FieldType))
            {
              //判斷單例存儲中是否包含,如果有,取出賦值,這里可以防止循環依賴導致的死循環
              if (SingleInstanceDic.ContainsKey(FieldType))
              {
                Field.SetValue(obj, SingleInstanceDic[FieldType]);
              }
              else
              {
                Field.SetValue(obj, Resolve(FieldType));
              }
              
            }
          }
        }
      }
      return obj;

    }

GetInstance方法就是實例化Bean對象的核心方法,其實很簡單,就是通過反射創建對象,其中需要注意的有兩點

1)對于一個Bean初始化時需要掃描Bean中的所有變量,如果內部還有依賴注入的嵌套對象,需要使用遞歸,直到沒有需要注入的Field

2)我這里使用的是單例模式,因為在測試過程中可能存在在A類中對B進行依賴注入,在B類中對A進行依賴注入,常規創建過程,如果使用遞歸進行掃描,就會進入死循環,內存溢出,所以使用對象的單例,一旦創建就放入字典中,如果再次掃描到該對象需要注入,則直接取出使用,就避免了循環引用

3.其他

對其他不在Controller中使用的類需要依賴注入,則需要直接從IOC的Bean容器取出使用

 private AuthUtil @AuthUtil = InjectUtil.Container.Resolve<AuthUtil>();

ASP.NET 是什么

ASP.NET 是開源,跨平臺,高性能,輕量級的 Web 應用構建框架,常用于通過 HTML、CSS、JavaScript 以及服務器腳本來構建網頁和網站。

看完上述內容,你們掌握怎么在ASP.NET中利用MVC實現依賴注入的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

马关县| 筠连县| 仙游县| 德令哈市| 荃湾区| 安泽县| 邯郸市| 河东区| 宾川县| 谢通门县| 盐津县| 松溪县| 密山市| 安多县| 秭归县| 彰化市| 济宁市| 广河县| 绍兴县| 文山县| 广安市| 晋州市| 海宁市| 洛川县| 黔东| 昌吉市| 巴彦县| 桦甸市| 临安市| 曲沃县| 同仁县| 波密县| 衡阳市| 洪泽县| 吉木萨尔县| 沙河市| 弥渡县| 惠安县| 石河子市| 黄梅县| 磴口县|