asp.net中控制反轉(zhuǎn)的理解(文字+代碼)
對(duì)IOC的解釋為:“Inversion of control is a common characteristic of frameworks, so saying that these lightweight containers are special because they use inversion of control is like saying my car is special because it has wheels.”
我想對(duì)這一概念執(zhí)行 一個(gè)個(gè)人的闡述,以方便我的理解??刂品崔D(zhuǎn),從字面意思來(lái)看, 就是控制權(quán)由被動(dòng)變主動(dòng)又變?yōu)楸粍?dòng),或被動(dòng)變主動(dòng)又變?yōu)楸粍?dòng)。從這個(gè)角度來(lái)說(shuō),IOC就變得非常容易理解了。
舉個(gè)例子:你的主管要求你做一件事情,這個(gè)時(shí)候就存在這么多個(gè) 流程 ,主管命令你做事情(這個(gè)時(shí)候主動(dòng)權(quán)在主管,你是被動(dòng)的)
你接到命令做事情(這個(gè)時(shí)候主題是你,你是主動(dòng)的,控制權(quán)在你手里) 你完成事情(這個(gè)時(shí)候主題依然是你,控制權(quán)在你手里)
報(bào)告主管做完事情(主動(dòng)權(quán)又叫交到主管手里了)
上面的整個(gè)流程 就完成了一次IOC,從上面可以看出,IOC的基本思想是控制權(quán)的轉(zhuǎn)換流程 。
舉個(gè)代碼的例子:
假如有Class A,Class B,在A內(nèi)部會(huì)原始化一個(gè)B,調(diào)用B的一個(gè)要領(lǐng)
DoMethod public Class B { public void DoMethod() { /// do somthing; } } public Class A { public void Excute() { B b = new B(); b.DoMethod(); } }
假如在Main函數(shù)中如下執(zhí)行: A a = new A(); a.Excute();
從這兩行代碼來(lái)看,事實(shí)上也存在一個(gè)IOC的流程 ,a——>b——>a,理解的關(guān)鍵點(diǎn)就在在A的內(nèi)部調(diào)用Excute的時(shí)候, 要領(lǐng) b.DoMethod的執(zhí)行。 理解了IOC,我們?cè)倏匆幌翫I, 從上面A調(diào)用B我們可以看出, 在原始化一個(gè)A的實(shí)例時(shí),也必須實(shí)例化一個(gè)B,也就是說(shuō)如果沒(méi)有B或者B出了疑問(wèn) , A就不能 實(shí)例化,這就產(chǎn)生了一種依賴(lài),就是A依賴(lài)B, 這種依賴(lài)從設(shè)計(jì)的角度來(lái)說(shuō)就是耦合,顯然它是不能 滿足高內(nèi)聚低耦合的要求的。這個(gè)時(shí)候就須要 解耦, 當(dāng)然解耦有很多種要領(lǐng) , 而DI就是其中一種。不管任何一種解耦要領(lǐng) ,都不是說(shuō)使A和B完全沒(méi)有聯(lián)系 , 而是把這種聯(lián)系 的實(shí)現(xiàn)變得隱晦,不那么直接,但是又很容易實(shí)現(xiàn), 而且易于擴(kuò)展,不像上面的代碼那樣,直接new一個(gè)B出來(lái)。那為什么我們總是把IOC和DI聯(lián)系到一起呢? 是因?yàn)镈I的基本思想就是IOC,而體現(xiàn)IOC 思想的要領(lǐng) 還有另外一個(gè),那就是Service Locator,這個(gè)要領(lǐng) 好像涉及到的很少。其實(shí)這些都是從java里面衍生出來(lái)的,雖然本人已經(jīng)好幾年沒(méi)用java,里面Spring這些都會(huì)用到IOC、DI好像他們是緊密連接在一塊的。
- KindEditor圖片上傳的Asp.net代碼實(shí)例
- ASP.net中網(wǎng)站訪問(wèn)量統(tǒng)計(jì)方法代碼
- ASP.NET中為T(mén)extBox中添加calendar.js示例代碼
- ASP.NET JSON字符串與實(shí)體類(lèi)的互轉(zhuǎn)換示例代碼
- asp.net中利用Jquery+Ajax+Json實(shí)現(xiàn)無(wú)刷新分頁(yè)的實(shí)例代碼
- Asp.Net模擬表單提交數(shù)據(jù)和上傳文件的實(shí)現(xiàn)代碼
- Asp.Net中的字符串和HTML十進(jìn)制編碼轉(zhuǎn)換實(shí)現(xiàn)代碼
- ASP.NET自動(dòng)為URL加上超鏈接的代碼
- asp.net+ajaxfileupload.js 實(shí)現(xiàn)文件異步上傳代碼分享
- ASP.NET連接sql2008數(shù)據(jù)庫(kù)的實(shí)現(xiàn)代碼
- 使用ASP.NET中關(guān)于代碼分離的實(shí)例分享
相關(guān)文章
ASP.NET MVC限制同一個(gè)IP地址單位時(shí)間間隔內(nèi)的請(qǐng)求次數(shù)
這篇文章介紹了ASP.NET MVC限制同一個(gè)IP地址單位時(shí)間間隔內(nèi)請(qǐng)求次數(shù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10DropDownList綁定數(shù)據(jù)表實(shí)現(xiàn)兩級(jí)聯(lián)動(dòng)示例
這篇文章主要介紹了DropDownList綁定數(shù)據(jù)表實(shí)現(xiàn)兩級(jí)聯(lián)動(dòng)具體實(shí)現(xiàn),需要的朋友可以參考下2014-03-03詳解如何在ASP.NET Core中應(yīng)用Entity Framework
本篇文章主要介紹了如何在ASP.NET Core中應(yīng)用Entity Framework,具有一定的參考價(jià)值,有興趣的可以一起了解一下。2016-12-12.NET中獲取Access新增記錄Id怪現(xiàn)象解決方法
寫(xiě)了一個(gè)函數(shù)獲取Access表中指定用戶Id,要求當(dāng)傳入的用戶名不存在時(shí),則在表中新增一條記錄并返回Id2012-03-03使用updatepanel局部刷新實(shí)現(xiàn)注冊(cè)時(shí)對(duì)用戶名的檢測(cè)示例
這篇文章主要介紹了使用updatepanel局部刷新實(shí)現(xiàn)注冊(cè)時(shí)對(duì)用戶名的檢測(cè)示例,需要的朋友可以參考下2014-03-03ASP.NET通過(guò)自定義函數(shù)實(shí)現(xiàn)對(duì)字符串的大小寫(xiě)切換功能
這篇文章主要介紹了ASP.NET通過(guò)自定義函數(shù)實(shí)現(xiàn)對(duì)字符串的大小寫(xiě)切換功能的方法,給出了兩個(gè)簡(jiǎn)單的實(shí)現(xiàn)方法,涉及asp.net字符串轉(zhuǎn)換操作的相關(guān)技巧,需要的朋友可以參考下2015-07-07Discuz!NT 3與asp.net 整合的實(shí)例教程
本次整合只針對(duì)NETSNS中的代碼做了少許修改,完成了基本的和論壇同步注冊(cè),登陸和注銷(xiāo),信息獲取,信息修改。為的是給各位Discuz!NT API愛(ài)好者做一個(gè)簡(jiǎn)單的API事例,供大家參考。2009-11-11ASP.NET?MVC5網(wǎng)站開(kāi)發(fā)之用戶添加和瀏覽2(七)
這篇文章主要為大家詳細(xì)介紹了ASP.NET?MVC5網(wǎng)站開(kāi)發(fā)之用戶添加和瀏覽,感興趣的小伙伴們可以參考一下2016-08-08