控制反轉- 維基百科,自由的百科全書

文章推薦指數: 80 %
投票人數:10人

控制反轉(英語:Inversion of Control,縮寫為IoC),是物件導向程式設計中的一種設計原則,可以用來減低電腦代碼之間的耦合度。

其中最常見的方式叫做依賴 ... 控制反轉 維基百科,自由的百科全書 跳至導覽 跳至搜尋 此條目需要精通或熟悉計算機科學的編者參與及協助編輯。

請邀請適合的人士改善本條目。

更多的細節與詳情請參見討論頁。

此條目已列出參考文獻,但因為沒有文內引註而使來源仍然不明。

(2021年3月22日)請加上合適的文內引註來改善這篇條目。

控制反轉(英語:InversionofControl,縮寫為IoC),是物件導向程式設計中的一種設計原則,可以用來減低電腦代碼之間的耦合度。

其中最常見的方式叫做依賴注入(DependencyInjection,簡稱DI),還有一種方式叫「依賴尋找」(DependencyLookup)。

目次 1起源 2技術描述 3實現方法 3.1依賴注入 3.2依賴查找 4控制反轉應用實例 4.1C++ 4.2Java 4.3.NET 4.4PHP 5參考文檔 6外部連結 起源[編輯] 早在2004年,MartinFowler就提出了「哪些方面的控制被反轉了?」這個問題。

他總結出是依賴物件的獲得被反轉了,因為大多數應用程式都是由兩個或是更多的類通過彼此的合作來實現業務邏輯,這使得每個物件都需要取得與其合作的物件(也就是它所依賴的物件)的參照。

如果這個取得過程要靠自身實現,那麼這將導致代碼高度耦合並且難以維護和除錯。

技術描述[編輯] ClassA中用到了ClassB的物件b,一般情況下,需要在A的代碼中顯式地用new建立B的物件。

採用依賴注入技術之後,A的代碼只需要定義一個private的B物件,不需要直接new來獲得這個物件,而是通過相關的容器控制程式來將B物件在外部new出來並注入到A類里的參照中。

而具體取得的方法、物件被取得時的狀態由設定檔(如XML)來指定。

實現方法[編輯] 實現控制反轉主要有兩種方式:依賴注入和依賴尋找。

兩者的區別在於,前者是被動的接收物件,在類A的實例建立過程中即建立了依賴的B物件,通過類型或名稱來判斷將不同的物件注入到不同的屬性中,而後者是主動索取相應類型的物件,獲得依賴物件的時間也可以在代碼中自由控制。

依賴注入[編輯] 主條目:依賴注入 依賴注入有如下實現方式: 基於介面。

實現特定介面以供外部容器注入所依值型別的物件。

基於set方法。

實現特定屬性的publicset方法,來讓外部容器呼叫傳入所依值型別的物件。

基於建構函式。

實現特定參數的建構函式,在新建物件時傳入所依值型別的物件。

基於註解。

基於Java的註解功能,在私有變數前加「@Autowired」等註解,不需要顯式的定義以上三種代碼,便可以讓外部容器傳入對應的物件。

該方案相當於定義了public的set方法,但是因為沒有真正的set方法,從而不會為了實現依賴注入導致暴露了不該暴露的介面(因為set方法只想讓容器存取來注入而並不希望其他依賴此類的物件存取)。

依賴尋找[編輯] 依賴尋找更加主動,在需要的時候通過呼叫框架提供的方法來取得物件,取得時需要提供相關的設定檔路徑、key等資訊來確定取得物件的狀態 控制反轉應用實例[編輯] C++[編輯] PocoCapsuleIoCandDSMframework(頁面存檔備份,存於網際網路檔案館)LGPL開源的,支援完全非侵入C++的控制反轉(IoC)及領域特定建模(DSM)容器 hypodermic(頁面存檔備份,存於網際網路檔案館)MIT開源協定,Hypodermic是一個基於C++11開發的控制反轉(IoC)容器,它為你的C++物件協同運作提供依賴注入。

Hypodermic靈感來自著名的.NETIoC專案Autofac。

Java[編輯] 使用Java語言寫成的程式在控制反轉容器(InversionofControlContainer)裡應用了控制反轉(Martin2004)。

軟體需要一個來自容器的物件,而容器自行建構物件和它的附屬物。

ATG(英語:ArtTechnologyGroup)的Dynamo應用程式伺服器是第一個利用這途徑的環境之一,近來關於這些容器的例子包含了HiveMind、PicoContainer(頁面存檔備份,存於網際網路檔案館)、SpringFramework(注意Spring是一個完整的企業平台,而非IOC容器)、ApacheExcalibur、Seasar和DPMLMetro. .NET[編輯] Ninject(頁面存檔備份,存於網際網路檔案館) Spring.NET(頁面存檔備份,存於網際網路檔案館) ObjectBuilder(頁面存檔備份,存於網際網路檔案館) Structuremap(頁面存檔備份,存於網際網路檔案館) CastleProject Seasar(頁面存檔備份,存於網際網路檔案館) Autofac(頁面存檔備份,存於網際網路檔案館) Unity(頁面存檔備份,存於網際網路檔案館) MET PHP[編輯] PhalconPHP框架中應用了依賴注入:DIinPhalcon(頁面存檔備份,存於網際網路檔案館) LaravelPHP框架核心的服務容器支援依賴注入:ServiceContainer 參考文件[編輯] ^RobertCecilMartin.AgileSoftwareDevelopment:Principles,PatternsandPractices.PearsonEducation.2002.ISBN978-0-13-597444-5.  ^RobertCecilMartin.TheDependencyInversionPrinciple(PDF).[2005-11-15].(原始內容(PDF)存檔於2004-12-21).  ^MartinFowler.InversionofControlContainersandtheDependencyInjectionPattern.2004[2005-11-15].(原始內容存檔於2020-05-30).  ^SonyMathew.ExaminingtheValidityofInversionofControl.2005[2005-11-16].(原始內容存檔於2005-11-29).  ^KeJin.DomainSpecificModeling(DSM)inIoCframeworks.2007[2007-11-13].(原始內容存檔於2007-11-15).  外部連結[編輯] AnotherdescriptionofIOC Alistof"OpenSourceInversionofControlContainers(頁面存檔備份,存於網際網路檔案館)" AsimpledemoofInversionofControl(usingSpringframework) InversionofControlContainersandtheDependencyInjectionpatternbyMartinFowler(頁面存檔備份,存於網際網路檔案館) Needle,adependencyinjection(inversionofcontrol)containerforRuby(頁面存檔備份,存於網際網路檔案館) DripIoC(頁面存檔備份,存於網際網路檔案館),adependencyinjection(inversionofcontrol)containerforPHP4(頁面存檔備份,存於網際網路檔案館) PyContainer(頁面存檔備份,存於網際網路檔案館),adependencyinjection(inversionofcontrol)containerforPython(頁面存檔備份,存於網際網路檔案館) QtIocContainer(頁面存檔備份,存於網際網路檔案館),adependencyinjection(inversionofcontrol)containerforC++(頁面存檔備份,存於網際網路檔案館) IntroducingCastle,explainstheproblemsthatInversionofcontrolcontainerstrytosolve(usingCastleProject) PocoCapsule(頁面存檔備份,存於網際網路檔案館)AnopensourceIoCandDSMframeworkforC++ DomainSpecificModeling(DSM)inIoCframeworks(頁面存檔備份,存於網際網路檔案館) 閱論編軟體設計模式設計模式建立型 抽象工廠 生成器 工廠方法 惰性初始 原型 單例 結構型 配接器 橋接 Composite(英語:Compositepattern) 修飾 外觀 享元 代理 行為型 責任鏈 命令 Interpreter(英語:Interpreterpattern) 迭代器 中介者 Memento(英語:Mementopattern) 觀察者 Specification(英語:Specificationpattern) State(英語:Statepattern) 策略 模板方法 存取者 函數式 么半群 函子 應用式 單子 Comonad Freemonad HOF 柯里化 函式複合(英語:Functioncomposition(computerscience)) 閉包 生成器 並列模式 主動物件(英語:Activeobject) 阻止(英語:Balkingpattern) Bindingproperties(英語:Bindingpropertiespattern) 雙重檢查鎖定模式 非同步方法呼叫 Future與promise Guardedsuspension(英語:Guardedsuspension) Join(英語:Join-pattern) 鎖 Messaging(英語:Messagingpattern) 監視器 Proactor(英語:Proactorpattern) 反應器 讀寫鎖 排程 執行緒池 Thread-localstorage(英語:Thread-localstorage) 架構模式 ADR(英語:Action–Domain–Responder) 主動記錄 Broker(英語:Brokerpattern) 主從式架構 cbd DAO DDD Datatransferobject(英語:Datatransferobject) Frontcontroller(英語:Frontcontroller) Identitymap(英語:Identitymappattern) Interceptor(英語:Interceptorpattern) 控制反轉 MVC 微服務 MVP 單體式應用程式 多層架構 n-tier(英語:Multitierarchitecture) Nakedobjects(英語:Nakedobjects) P2P 發布/訂閱 REST SOA Specification(英語:Specificationpattern) 執行緒局部儲存 雲分散式 斷路器 CQRS(英語:Command–queryseparation) 補償交易(英語:CompensatingTransaction) 索引表 領導者選舉(英語:Leaderelection) MapReduce 物化視圖(英語:Materializedview) 管道 過濾器(英語:Filter(software)) 發布/訂閱 分片(英語:Shard(databasearchitecture)) 節流(英語:Throttlingprocess(computing)) 其他模式 Blackboard(英語:Blackboarddesignpattern) Businessdelegate(英語:Businessdelegatepattern) Compositeentity(英語:Compositeentitypattern) 委託 依賴注入 Interceptingfilter(英語:Interceptingfilterpattern) 惰性載入 Methodchaining(英語:Methodchaining) 類比物件 空物件 物件池 Servant(英語:Servant(designpattern)) Twin(英語:Twinpattern) Typetunnel(英語:TypeTunnelpattern) 書籍 設計模式:可復用物件導向軟體的基礎 企業整合模式(英語:EnterpriseIntegrationPatterns) 人物 克里斯托佛·亞歷山大 埃里希·伽瑪 RalphJohnson(英語:RalphJohnson(computerscientist)) JohnVlissides(英語:JohnVlissides) 葛來迪·布區 肯特·貝克 沃德·坎寧安 馬丁·福勒 RobertMartin(英語:RobertCecilMartin) JimCoplien(英語:JimCoplien) DouglasSchmidt(英語:DouglasC.Schmidt) LindaRising 社群 TheHillsideGroup(英語:TheHillsideGroup) ThePortlandPatternRepository(英語:PortlandPatternRepository) 取自「https://zh.wikipedia.org/w/index.php?title=控制反转&oldid=69160247」 分類:​物件導向的程序設計基於組件的軟體工程Java編程原則軟體架構軟體設計模式隱藏分類:​需要計算機科學專家關注的頁面自2021年3月缺少註腳的條目含有英語的條目使用ISBN魔術連結的頁面 導覽選單 個人工具 沒有登入討論貢獻建立帳號登入 命名空間 條目討論 臺灣正體 不转换简体繁體大陆简体香港繁體澳門繁體大马简体新加坡简体臺灣正體 查看 閱讀編輯檢視歷史 更多 搜尋 導航 首頁分類索引特色內容新聞動態近期變更隨機條目資助維基百科 說明 說明維基社群方針與指引互助客棧知識問答字詞轉換IRC即時聊天聯絡我們關於維基百科 工具 連結至此的頁面相關變更上傳檔案特殊頁面靜態連結頁面資訊引用此頁面維基數據項目 列印/匯出 下載為PDF可列印版 其他語言 العربيةDeutschEnglishEspañolفارسیFrançaisעבריתMagyarItaliano日本語한국어PolskiPortuguêsРусскийSvenskaУкраїнська 編輯連結



請為這篇文章評分?