• <sub id="xcyjv"></sub><nav id="xcyjv"><code id="xcyjv"><meter id="xcyjv"></meter></code></nav>
      <nav id="xcyjv"></nav>
    1. <form id="xcyjv"><th id="xcyjv"></th></form><nav id="xcyjv"><mark id="xcyjv"></mark></nav>

        ASP.NET MVC實現依賴注入的完整過程

         更新時間:2019年09月11日 11:20:59   作者:Pine_Yan   我要評論
        這篇文章主要給大家介紹了關于ASP.NET MVC實現依賴注入的完整過程,文中通過示例代碼介紹的非常詳細,對大家學習或者使用ASP.NET MVC具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

        前言

        在java的spring中有自動注入功能,使得代碼變得更加簡潔靈活,所以想把這個功能移植到c#中,接下來逐步分析實現過程

        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 MVC快速開發框架,希望支持一波

        地址:https://gitee.com/grassprogramming/FastExecutor

        總結

        以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

        相關文章

        最新評論

        01彩票网app
      1. <sub id="xcyjv"></sub><nav id="xcyjv"><code id="xcyjv"><meter id="xcyjv"></meter></code></nav>
          <nav id="xcyjv"></nav>
        1. <form id="xcyjv"><th id="xcyjv"></th></form><nav id="xcyjv"><mark id="xcyjv"></mark></nav>
            贵州贵阳 | 湛江 | 云浮 | 深圳 | 安庆 | 台北 | 临猗 | 唐山 | 台中 | 万宁 | 绵阳 | 万宁 | 鹤岗 | 益阳 | 安阳 | 临猗 | 安徽合肥 | 汉川 | 南平 | 海拉尔 | 天水 | 汝州 | 云浮 | 南京 | 乳山 | 嘉兴 | 澳门澳门 | 惠东 | 新沂 | 沭阳 | 锡林郭勒 | 海宁 | 大兴安岭 | 三沙 | 汕尾 | 白沙 | 海北 | 儋州 | 咸阳 | 资阳 | 台湾台湾 | 丽水 | 邹平 | 莱州 | 海宁 | 资阳 | 松原 | 博尔塔拉 | 玉溪 | 柳州 | 禹州 | 自贡 | 东营 | 丹阳 | 琼海 | 六安 | 龙口 | 黄石 | 莱芜 | 周口 | 石河子 | 伊春 | 日照 | 阜新 | 定西 | 大兴安岭 | 澄迈 | 贺州 | 灌南 | 西藏拉萨 | 阿拉尔 | 吴忠 | 肥城 | 黔西南 | 巴彦淖尔市 | 玉林 | 韶关 | 乐平 | 包头 | 永州 | 象山 | 抚顺 | 海西 | 燕郊 | 安康 | 伊春 | 高雄 | 临夏 | 芜湖 | 宜昌 | 临海 | 东营 | 杞县 | 辽阳 | 惠州 | 日喀则 | 桂林 | 济源 | 汕头 | 乌兰察布 | 咸阳 | 东海 | 邳州 | 泰兴 | 温州 | 南阳 | 鸡西 | 南阳 | 黄冈 | 招远 | 固原 | 东莞 | 赤峰 | 东阳 | 正定 | 黔西南 | 内江 | 汕头 | 楚雄 | 黄石 | 攀枝花 | 青海西宁 | 开封 | 商洛 | 玉环 | 宜都 | 海宁 | 哈密 | 临汾 | 香港香港 | 章丘 | 淮北 | 吉安 | 辽阳 | 长葛 | 晋中 | 吐鲁番 | 三亚 | 怒江 | 吴忠 | 巴中 | 台南 | 临夏 | 绍兴 | 六安 | 铜川 | 邳州 | 建湖 | 赣州 | 株洲 | 随州 | 图木舒克 | 简阳 | 抚州 | 随州 | 单县 | 顺德 | 乳山 | 延安 | 甘孜 | 燕郊 | 惠东 | 定州 | 恩施 | 神木 | 赣州 | 兴安盟 | 长治 | 吴忠 | 溧阳 | 南阳 | 甘南 | 克拉玛依 | 雅安 | 湖南长沙 | 池州 | 黔东南 | 瑞安 | 琼海 | 临汾 | 吉林 | 泸州 | 章丘 | 黔南 | 喀什 | 朔州 | 伊犁 | 偃师 | 雅安 | 泰州 | 单县 | 钦州 | 东方 | 江西南昌 | 抚州 | 厦门 | 绍兴 | 金坛 | 江西南昌 | 邢台 | 招远 | 永康 | 鹤壁 | 西双版纳 | 温岭 | 眉山 | 山东青岛 | 苍南 | 宝应县 | 乌海 | 承德 | 海丰 | 泰州 | 玉溪 | 文昌 | 四川成都 | 忻州 | 平潭 | 黔南 | 德州 | 衢州 | 固原 | 秦皇岛 | 来宾 | 四平 | 资阳 | 天水 | 海北 | 抚州 | 文山 | 上饶 | 海宁 | 安庆 | 牡丹江 | 迁安市 | 辽阳 | 任丘 | 大庆 | 明港 | 雅安 | 台山 | 徐州 | 阳江 | 和县 | 葫芦岛 | 唐山 | 象山 | 孝感 | 巴彦淖尔市 | 常州 | 张掖 | 如皋 | 万宁 | 乐平 | 柳州 | 日照 | 遂宁 | 毕节 | 乌兰察布 | 临猗 | 琼海 | 丹东 | 日喀则 | 来宾 | 临汾 | 呼伦贝尔 | 顺德 | 益阳 | 辽阳 | 临汾 | 葫芦岛 | 荆州 | 西双版纳 | 池州 | 厦门 | 丽江 | 衡阳 | 抚顺 | 台南 | 三亚 | 自贡 | 永新 | 天长 | 娄底 | 呼伦贝尔 | 甘南 | 汉中 | 南阳 | 浙江杭州 | 景德镇 | 株洲 | 红河 | 四川成都 | 兴安盟 | 潮州 | 湘西 | 阜阳 | 贺州 | 山西太原 | 阜新 | 垦利 | 昆山 | 兴化 | 佛山 | 仙桃 | 丽水 | 淄博 | 基隆 | 贺州 | 丹阳 | 酒泉 | 泰兴 | 邯郸 | 任丘 | 平顶山 | 六安 | 鄢陵 | 德宏 | 德清 | 阿勒泰 | 商洛 | 吉林长春 | 招远 | 琼海 | 肇庆 | 海安 | 山南 | 青海西宁 | 黄山 | 如东 | 呼伦贝尔 | 铜陵 | 株洲 | 莆田 | 海南海口 | 定西 | 偃师 | 三亚 | 濮阳 | 泗阳 | 清远 | 宜都 | 台中 | 昌吉 | 松原 | 营口 | 日喀则 | 山东青岛 | 海安 | 琼中 | 乐清 | 吉林长春 | 漳州 | 大同 | 嘉兴 | 德阳 | 赣州 | 东台 | 扬州 | 图木舒克 | 龙口 | 桂林 | 鞍山 | 日喀则 | 博罗 | 西双版纳 | 三门峡 | 渭南 | 宣城 | 七台河 | 酒泉 | 项城 | 河南郑州 | 青海西宁 | 哈密 | 莒县 | 乐山 | 信阳 | 湖州 | 南平 | 河源 | 石狮 | 锡林郭勒 | 楚雄 | 余姚 | 那曲 | 招远 | 四平 | 晋江 | 商丘 | 舟山 | 上饶 | 汉川 | 怒江 | 台南 | 六安 | 萍乡 | 新泰 | 自贡 | 内蒙古呼和浩特 | 龙口 | 赣州 | 瓦房店 | 陇南 | 甘孜 | 常德 | 醴陵 | 宜昌 | 扬州 | 福建福州 | 和田 | 安岳 | 安阳 | 东阳 | 余姚 | 大同 | 巴中 | 乐山 | 内蒙古呼和浩特 | 吴忠 | 株洲 | 济南 | 盐城 | 海丰 | 清徐 | 黔南 | 阜新 | 嘉善 | 朔州 | 东方 | 那曲 | 和县 | 潍坊 | 青州 | 日喀则 | 任丘 | 运城 | 清徐 | 玉树 | 肥城 | 灵宝 | 巴彦淖尔市 | 澳门澳门 | 鸡西 | 鸡西 | 达州 | 泸州 | 德阳 | 寿光 | 达州 | 茂名 | 九江 | 慈溪 | 塔城 | 丹阳 | 玉林 | 宿迁 | 石河子 | 哈密 | 章丘 | 保亭 | 陕西西安 | 莒县 | 三明 | 深圳 | 沛县 | 丹东 | 宣城 | 遂宁 | 宁波 | 荆门 | 宁德 | 益阳 | 吴忠 | 阿克苏 | 新沂 | 随州 | 晋城 | 莱芜 | 嘉善 | 日喀则 | 青州 | 孝感 | 兴安盟 | 马鞍山 | 吉安 | 汉中 | 阿拉尔 | 湖州 | 宜都 | 寿光 | 文昌 | 定安 | 锡林郭勒 | 百色 | 山东青岛 | 滨州 | 吕梁 | 大连 | 高密 | 滕州 | 辽源 | 昭通 | 广安 | 永州 | 象山 | 揭阳 | 温州 | 辽阳 | 嘉善 | 任丘 | 吐鲁番 | 库尔勒 | 松原 | 中卫 | 禹州 | 宜都 | 佳木斯 | 揭阳 | 云南昆明 | 博尔塔拉 | 大庆 | 西藏拉萨 | 潜江 | 澄迈 | 宣城 | 三沙 | 那曲 | 牡丹江 | 贺州 | 涿州 | 金昌 | 周口 | 仁寿 | 宣城 | 昭通 | 赣州 | 澳门澳门 | 喀什 | 宿迁 | 珠海 | 辽阳 | 抚州 | 大理 | 海北 | 哈密 | 定西 | 长兴 | 山东青岛 | 宜都 | 宁国 | 三亚 | 金坛 | 铜陵 | 朔州 | 定安 | 香港香港 | 延安 | 南平 | 义乌 | 昌吉 | 乳山 | 襄阳 | 牡丹江 | 广饶 | 香港香港 | 蓬莱 | 垦利 | 黔西南 | 沭阳 | 崇左 | 包头 | 诸城 | 酒泉 | 兴化 | 连云港 | 大连 | 恩施 | 台北 | 宜宾 | 宝应县 | 鞍山 | 南平 | 南平 | 沛县 | 福建福州 | 岳阳 | 怀化 | 安徽合肥 | 鄂尔多斯 | 朝阳 | 烟台 | 益阳 | 毕节 | 黑河 | 阳泉 | 莱芜 | 定州 | 清徐 | 四平 | 泸州 | 景德镇 | 临沧 | 庆阳 | 新余 | 淮北 | 高密 | 大连 | 张掖 | 德清 | 中卫 | 潮州 | 江门 | 廊坊 | 信阳 | 常州 | 吉林 | 阿拉尔 | 阿克苏 | 扬州 | 丹阳 | 衡水 | 云南昆明 | 苍南 | 衡水 | 邹平 | 鄂尔多斯 | 鹤岗 | 郴州 | 澄迈 | 铁岭 | 嘉峪关 | 铁岭 | 洛阳 | 防城港 | 商洛 | 琼海 | 百色 | 赵县 | 晋江 | 海西 | 临汾 | 鹰潭 | 邹平 | 五指山 | 万宁 | 和田 | 临沂 | 阳江 | 四平 | 东海 | 燕郊 | 乐清 | 丹东 | 仁怀 | 黄山 | 绥化 | 台州 | 金昌 | 菏泽 | 绍兴 | 焦作 | 乌海 | 江苏苏州 | 咸宁 | 正定 | 雄安新区 | 海南海口 | 九江 | 如皋 | 黑河 | 洛阳 | 濮阳 | 桂林 | 云浮 | 丽水 | 济宁 | 通化 | 莱州 | 丽水 | 乐清 | 北海 | 燕郊 | 山西太原 | 汉中 | 东台 | 临沂 | 五家渠 | 仁怀 | 通辽 | 平潭 | 公主岭 | 贺州 | 平凉 | 宁国 | 商洛 | 大庆 | 宿迁 | 泸州 | 安康 | 德阳 | 淮南 | 朝阳 | 南京 | 乌兰察布 | 济宁 | 伊犁 | 厦门 | 黑龙江哈尔滨 | 和田 | 汉川 | 南阳 | 黔南 | 白银 | 百色 | 嘉善 | 高雄 | 安顺 | 鹤岗 | 永康 | 肇庆 | 正定 | 昌吉 | 清远 | 克孜勒苏 | 潮州 | 惠州 | 四川成都 | 通辽 | 五指山 | 宜宾 | 哈密 | 巴音郭楞 | 商洛 | 燕郊 | 济源 | 瑞安 | 石河子 | 安康 | 吉安 | 南充 | 任丘 | 驻马店 | 清徐 | 包头 | 仁寿 | 馆陶 | 湘西 | 喀什 | 丽水 | 乐平 | 伊犁 | 达州 | 洛阳 | 榆林 | 南京 | 临沂 | 博尔塔拉 | 安吉 | 辽源 | 湘潭 | 韶关 | 达州 | 海安 | 三门峡 | 朔州 | 吉林长春 | 伊春 | 丽江 | 瓦房店 | 灵宝 | 金华 | 汕尾 | 呼伦贝尔 | 盘锦 | 双鸭山 | 桐城 | 鸡西 | 常德 | 泉州 | 枣庄 | 广汉 | 海北 | 晋江 | 泰安 | 如东 | 遵义 | 安顺 | 仁寿 | 单县 | 湘潭 | 长垣 | 潍坊 | 宁夏银川 | 佳木斯 | 济源 | 萍乡 | 广西南宁 | 肥城 | 秦皇岛 | 漯河 | 正定 | 乌海 | 鹤壁 | 红河 | 惠州 | 百色 | 保定 | 基隆 | 醴陵 | 甘南 | 萍乡 | 邵阳 | 克孜勒苏 | 阜阳 | 柳州 | 玉环 | 甘肃兰州 | 新泰 | 台州 | 宝鸡 | 鸡西 | 朝阳 | 仁寿 | 池州 | 大兴安岭 | 灵宝 | 昌都 | 曹县 | 凉山 | 博尔塔拉 | 巴中 | 江西南昌 | 灌云 | 酒泉 | 扬中 | 黄冈 | 吐鲁番 | 漯河 | 江门 | 章丘 | 沧州 | 广安 | 榆林 | 云南昆明 | 马鞍山 | 巴彦淖尔市 | 江西南昌 | 宜宾 | 本溪 | 衢州 | 湖北武汉 | 四平 | 河池 | 承德 | 无锡 | 曲靖 | 鹤岗 | 海门 | 兴化 | 渭南 | 吉安 | 本溪 | 海西 | 荆门 | 潍坊 | 贵港 | 姜堰 | 澳门澳门 | 临汾 | 兴安盟 | 伊春 | 兴安盟 | 仁怀 | 扬州 | 山西太原 | 辽宁沈阳 | 佛山 | 株洲 | 三亚 | 佛山 | 营口 | 五家渠 | 开封 | 吕梁 | 汝州 | 安庆 | 永新 | 朝阳 | 保定 | 甘孜 | 四平 | 晋中 | 苍南 | 怀化 | 徐州 | 日喀则 | 文昌 | 图木舒克 | 日土 | 天水 | 宁夏银川 | 东营 | 曹县 | 慈溪 | 沛县 | 屯昌 | 张掖 | 昆山 | 扬中 | 崇左 | 湘潭 | 丽水 | 东营 | 河源 | 姜堰 | 贵港 | 安顺 | 武威 | 朝阳 | 广安 | 黄南 | 晋中 | 垦利 | 基隆 | 牡丹江 | 琼海 | 乌海 | 新乡 | 张家口 | 台中 | 新余 | 安岳 | 宁夏银川 | 长兴 | 兴安盟 | 海安 | 宣城 | 景德镇 | 抚顺 | 河池 | 灌云 | 泗阳 | 唐山 | 淮安 | 昌吉 | 石嘴山 | 开封 | 台中 | 南通 | 潮州 | 迁安市 | 海宁 | 厦门 | 阳春 | 日土 | 湘潭 | 神木 | 五家渠 | 黔西南 | 新沂 | 林芝 | 海北 | 湖南长沙 | 杞县 | 遵义 | 安康 | 温岭 | 宜宾 | 吐鲁番 | 寿光 | 霍邱 | 和田 | 六盘水 | 嘉善 | 日照 | 乌兰察布 | 吐鲁番 | 宝应县 | 昌都 | 单县 | 廊坊 | 嘉兴 | 阿勒泰 | 安顺 | 来宾 | 枣阳 | 沧州 | 燕郊 | 寿光 | 桂林 | 驻马店 | 铜陵 | 锦州 | 诸城 | 灵宝 | 商洛 | 寿光 | 通化 | 克拉玛依 | 广汉 | 九江 | 泰州 | 临汾 | 新疆乌鲁木齐 | 山南 | 仙桃 | 宁国 | 琼中 | 龙岩 | 鄂尔多斯 | 镇江 | 南安 | 阿克苏 | 博罗 | 伊犁 | 昆山 | 广安 | 淄博 | 临汾 | 和县 | 七台河 | 通化 | 晋江 | 曲靖 | 潍坊 | 建湖 | 长葛 | 果洛 | 温州 | 如皋 | 怒江 | 文昌 | 阳泉 | 金华 | 通辽 | 五指山 | 阿克苏 | 柳州 | 乐清 | 江门 | 贺州 | 晋城 | 延边 | 顺德 | 日照 | 通辽 | 简阳 | 株洲 | 新沂 | 巴彦淖尔市 | 阳江 | 东营 | 咸阳 | 海拉尔 | 霍邱 | 永新 | 平潭 | 忻州 | 高密 | 德宏 | 台山 | 丹阳 | 文昌 | 青海西宁 | 寿光 | 吉林长春 | 来宾 | 广汉 | 齐齐哈尔 | 凉山 | 舟山 | 定西 | 武夷山 | 陇南 | 锡林郭勒 | 桐城 | 石狮 | 广西南宁 | 潜江 |