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