亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

認識IoC

2019-11-17 03:08:29
字體:
來源:轉載
供稿:網友

認識IoC

  第一次接觸IoC是我在學習MVP框架的時候,搭建一個MVP框架需要用到IoC,那時候就以為IoC就是依賴注入,但在后來的逐步了解中發現那個只是它的別名而已。IoC全稱應該是Inversion of Control,中文稱為控制反轉;而依賴注入的簡稱是DI,全稱是Dependency Injection,個人覺得這兩者也不是那么一個別名的關系而已,控制反轉給我的感覺更多的是一種思想,而依賴注入卻正好是一種實現方式。那這里說說概念

  • 控制反轉:應用本身不負責以來對象的維護和創建,而交給一個外部容器來負責。這樣控制權就由應用轉到了外部IoC容器,控制權就實現了所謂的反轉。
  • 依賴注入:由外部容器在運行時動態地將以來的對象注入到組件中。

以上概念摘自蔣老師的著作《asp.net MVC4 框架揭秘》。但是技術這東西又沒必要向理論學術那樣嚴謹,能讓人知曉其中意圖則可,最初UML最初創作處理也是為了達到這個目的。

  高內聚低耦合一直是軟件開發中不斷追求的,現在各種框架MVC,MVP等都是為了解耦而誕生的。在我閱讀微軟的開源項目PetShop時發現里面用了耳熟能詳的三層架構中使用了最初我學C#時不知有什么作用的一個東西——接口Interface。它的存在很大的目的就是為了解耦,它能使一些比較具體的事物抽象化。那么本篇所討論的IoC也是使用了接口。

目前有很多IoC框架:Unity,SPRing.NeT,Ninject,StructureMap等。Ninject在我實踐MVP的時候用過,Unity在我閱讀蔣老師的著作時了解過,那么這回我將會嘗試一下之前沒用過的Unity,體驗一下依賴注入。

模擬使用一個三層架構來體驗這個Unity

定義DAL,BLL,UI層的接口IDAL,IBLL,IUI以及實現它們的類DAL,BLL,UI。

 1     interface IDAL 2     { 3         DataTable QueryDatas(); 4     } 5     interface IBLL 6     { 7         List<object> GetSomeDatas(); 8     } 9 10     interface IUI11     {12         void ShowData(IBLL bll);13     }14 15     class DAL : IDAL16     {17 18         public DataTable QueryDatas()19         {20             DataTable table = new DataTable();21             table.Columns.Add("Col");22             for (int i = 0; i < 10; i++)23             {24                 table.Rows.Add(i);25             }26             return table;27         }28     }29     class BLL : IBLL30     {31         [Dependency]32         public IDAL dal { get; set; }33 34         public List<object> GetSomeDatas()35         {36             List<object> result = new List<object>();37             DataTable table = dal.QueryDatas();38             foreach (DataRow row in table.Rows)39             {40                 result.Add(row[0]);41             }42             return result;43         }44     }45     class UI : IUI46     {47         [InjectionMethod]48         public void ShowData(IBLL bll)49         {50             List<object> datas = bll.GetSomeDatas();51             foreach (object item in datas)52             {53                 Console.WriteLine(item);54             }55         }56     }

在上面的代碼中BLL類的dal屬性使用了[Dependency] Attribute,使得該屬性是通過IoC容器自動去賦值,不需要通過代碼給它顯示賦值。UI的ShowData方法用了[InjectionMethod] Attribute,該方法在UI類被IoC容器自動執行。實際上上面代碼設計到IoC里面三種方式的其中兩種屬性注入和接口(方法)注入,那么還剩下一種就是構造器注入,

  • 在上面使用了Dependency Attribute的IDAL屬性則是使用屬性注入,使用了依賴注入的屬性在IoC容器構造對象的時候自動初始化賦值;
  • 上面使用了InjectionMethod Attribute的ShowData方法則是使用接口(方法)注入,使用了依賴注入的方法在IoC容器構造對象的時候自動執行該方法;
  • 還有一種沒有列舉出來的就是構造器注入, IoC容器會自動選擇和調用合適的構造函數以創建依賴的對象。如果被選擇的構造函數是帶參數的,IoC容器是會去創建該參數的實例的。上面的代碼還沒可以執行,需要在配置文件中添加以下內容
 1 <configuration> 2   <configSections> 3     <section name="unity" 4              type=" 5              Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, 6              Microsoft.Practices.Unity.Configuration"/> 7   </configSections> 8   <unity> 9     <containers>10       <container name="defaultContainer">11         <register type="AllTypeTestControl.IDAL,AllTypeTestControl" mapTo="AllTypeTestControl.DAL,AllTypeTestControl"/>12         <register type="AllTypeTestControl.IBLL,AllTypeTestControl" mapTo="AllTypeTestControl.BLL,AllTypeTestControl"/>13         <register type="AllTypeTestControl.IUI,AllTypeTestControl" mapTo="AllTypeTestControl.UI,AllTypeTestControl"/>14       </container>15     </containers>16   </unity>17 </configuration>

上面這段內容是指定了給Unity的IoC容器各個接口與實現類的映射關系,AllTypeTestControl.IDAL類型映射到AllTypeTestControl.DAL中去,表示通過DAL來實現IDAL的注入,其他同理。但每一項的注冊要按照

<register type="接口全名,程序集名" mapTo="類全名,程序集名"/>

通過下面的測試代碼來測試

1         public static void TestMain()2         {3             IUnityContainer container = new UnityContainer();4             UnityConfigurationSection configuration = 5                 ConfigurationManager.GetSection(UnityConfigurationSection.SectionName) 6                 as UnityConfigurationSection;7             configuration.Configure(container, "defaultContainer");8             UI ui = container.Resolve<IUI>() as UI ;9         }

主要是構造了一個IoC的容器,然后載入了配置文件的映射信息,除了通過配置文件來確定映射關系外,還可以通過代碼的形式來確定

        public static void TestMain()        {            IUnityContainer container = new UnityContainer();            container.RegisterType<IDAL, DAL>();            container.RegisterType<IBLL, BLL>();            container.RegisterType<IUI, UI>();            UI ui = container.Resolve<IUI>() as UI ;        }

代碼的運行結果如下

現在則把上面的BLL作一下修改

 1     class BLL : IBLL 2     { 3         //[Dependency] 4         //public IDAL dal { get; set; } 5  6         private IDAL dal; 7  8         //[InjectionConstructor] 9         public BLL(IDAL dal)10         {11             this.dal = dal;12         }13 14         //[InjectionConstructor]15         public BLL()16         { 17         18         }19 20         public List<object> GetSomeDatas()21         {22             List<object> result = new List<object>();23             DataTable table = dal.QueryDatas();24             foreach (DataRow row in table.Rows)25             {26                 result.Add(row[0]);27             }28             return result;29         }30     }

結果仍然和上面的一樣,IoC容器仍然能正確的匹配出類型構造了DAL對象。那么如果給BLL()構造函數加了InjectionConstructor Attribute,IoC容器只會去匹對帶了InjectionConstructor Attribute的構造函數,這樣BLL(IDAL dal)構造函數則不會被調用,運行起來就會拋出空引用異常。假如給BLL(IDAL dal)也加上了InjectionConstructor Attribute,那么它與無參構造函數BLL()屬于同級,IoC則會也調用BLL(IDAL dal)構造函數,dal字段能被正常的賦值。

  通過上面的實踐中能感覺到IoC有GOF中的工廠模式思想。用戶在使用著一個對象,但它并不負責對象的構造,把對象的構造移交了給第三方,在IoC中就是IoC容器,在工廠方法里面則是工廠了。在ASP.NET MVC中也使用了IoC,迷你MVC框架中控制器的構造是通過了一個工廠利用反射機制來構造出來的,而實際的ASP.NET MVC則是使用了IoC。

  對IoC的了解還不算多,手上有一份Ninject的源碼,但一直沒看,現在工作忙了,連博客也少寫了,時間得好好分配,要保持學習。以上有什么說的不對的請指正,有什么好的建議或意見也請分享,謝謝!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人精品免费久久久久| 最近2019中文免费高清视频观看www99| 亚洲人av在线影院| 91精品国产99久久久久久| 国产成人精品999| 亚洲欧洲激情在线| 日本电影亚洲天堂| 欧美黑人视频一区| 久久久中精品2020中文| 欧美激情亚洲一区| 日本精品视频在线| 亚洲成成品网站| 97在线视频免费| 成人黄色激情网| 91九色国产视频| 国产福利视频一区| 国产精品亚洲网站| 国产有码在线一区二区视频| 日韩中文字幕在线看| 欧美丝袜一区二区三区| 日韩中文字幕精品视频| 欧美精品成人在线| 国产伦精品一区二区三区精品视频| 欧美性猛交xxxxx免费看| 精品动漫一区二区三区| 亚洲精品一区二区三区不| 成人精品网站在线观看| 91产国在线观看动作片喷水| 亚洲精品中文字幕女同| 亚洲精品中文字幕有码专区| 亚洲国产精品小视频| 日韩午夜在线视频| 91国产视频在线| 欧美国产日韩一区二区| 欧美成人午夜视频| 精品亚洲一区二区三区| 欧美日韩免费区域视频在线观看| 北条麻妃一区二区三区中文字幕| 亚洲国产一区自拍| 91免费欧美精品| 国内精品久久久久| 国产福利成人在线| 亚洲一区二区在线| 欧美激情精品久久久久久黑人| 欧美激情免费在线| 日韩av高清不卡| 欧美日韩国产精品一区| 成人夜晚看av| 国产成人亚洲综合| www.亚洲一区| 三级精品视频久久久久| 亚洲第一偷拍网| 九九久久久久99精品| 欧美激情精品久久久久| 青青草原成人在线视频| 亚洲欧洲激情在线| 欧美黑人xxxⅹ高潮交| 欧美成人免费在线观看| 欧美日韩中文字幕综合视频| 九九热精品在线| 在线观看91久久久久久| 欧美成人免费全部| 亚洲石原莉奈一区二区在线观看| 久久99精品久久久久久噜噜| 久久亚洲私人国产精品va| 欧美日韩中文字幕综合视频| 日韩hd视频在线观看| 亚洲伊人久久大香线蕉av| 国产一区二区三区中文| 国产精品v片在线观看不卡| 亚洲国产精品成人一区二区| 日韩久久免费电影| 国产一区二区三区丝袜| 3344国产精品免费看| 亚洲精品电影网站| 成人伊人精品色xxxx视频| 亚洲一级免费视频| 美女扒开尿口让男人操亚洲视频网站| 色噜噜亚洲精品中文字幕| 国产成人免费91av在线| 国产视频精品va久久久久久| 国精产品一区一区三区有限在线| 国产精品美乳一区二区免费| 久久久久国产精品免费网站| 国产精品极品在线| 91高清视频免费观看| 国产香蕉精品视频一区二区三区| 欧美成人免费全部观看天天性色| 色偷偷综合社区| 日韩在线欧美在线| 欧美激情va永久在线播放| 久久综合久久美利坚合众国| 美女久久久久久久| 欧美激情a在线| 国产精品日韩在线播放| 538国产精品视频一区二区| 亚洲精品久久久久中文字幕欢迎你| 欧美日韩国产成人在线观看| 精品久久久久久久久久久久久| 一本一道久久a久久精品逆3p| 色婷婷**av毛片一区| 欧美亚洲成人xxx| 日韩av网站大全| 久久久久国产精品www| 亚洲高清福利视频| 福利精品视频在线| 日韩免费中文字幕| 欧美日韩亚洲网| 97色在线视频观看| 欧美一区二区影院| 国产精品视频久| 亚洲综合色激情五月| 欧美华人在线视频| 91在线视频九色| 国产网站欧美日韩免费精品在线观看| 亚洲美女福利视频网站| 亚洲精品一区久久久久久| 国产区精品在线观看| 91精品国产高清久久久久久| 9.1国产丝袜在线观看| 久久久久久亚洲| 精品国产一区二区三区久久| xxav国产精品美女主播| 精品国模在线视频| 黑人精品xxx一区一二区| 亚洲国产精品久久精品怡红院| 91精品国产成人www| 日韩经典中文字幕在线观看| 久久国产视频网站| 久久综合国产精品台湾中文娱乐网| 国产亚洲欧美视频| 欧美日韩免费在线观看| 欧美中文字幕视频| 精品综合久久久久久97| 91麻豆国产语对白在线观看| 亚洲黄色www网站| 最新国产精品拍自在线播放| 久久久久久久久综合| 欧美日韩亚洲视频| 国产精品一二三视频| 久久天天躁狠狠躁老女人| 日韩av日韩在线观看| 色先锋资源久久综合5566| 一区二区三区视频观看| 国产欧美 在线欧美| 一区二区欧美激情| 亚洲午夜久久久影院| 久久久久久国产精品三级玉女聊斋| 91免费综合在线| 欧美性生交大片免费| 亚洲一区二区久久久久久久| 日韩精品免费视频| 欧美激情视频在线免费观看 欧美视频免费一| 日本一区二区三区四区视频| 精品精品国产国产自在线| 国产原创欧美精品| 91在线无精精品一区二区| 久久五月天综合| 国产日韩欧美日韩| 欧美性猛交xxxx乱大交蜜桃| 久久精品国产精品亚洲| 精品国产视频在线| 少妇高潮久久77777| 一个人看的www欧美|