国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何采用IoC實現對應用程序的流程控制

454398 ? 來源:博客園 ? 作者:蔣金楠 ? 2020-10-29 11:21 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

我之前寫過一系列關于.NET Core依賴注入的文章,由于.NET Core依賴注入框架的實現原理發生了很大的改變,加上我對包括IoC和DI這些理論層面的東西又有了一些新的理解。

軟件設計中由一些所謂的理念都沒有一個明確的定義,比如之前流行的SOA和現在炒的火熱的微服務(Micro Service)和無服務器(Serverless),我們都不能通過一個明確的“內涵”給它們一個準確地定義,只能從“外延”上描述這些架構設計應該具有怎樣的特性。正因為無法給出一個明確的界定,造成了人們針對同一個概念出現了很多不同的理解。針對IoC也是這種情況,所以本章所訴的僅僅代表作者的一家之言,讀者朋友姑妄聽之,僅作參考。

一、流程控制的反轉

我聽到很多人將IoC說成是一種“面向對象的設計模式”,但在我個人看來IoC不能算作 一種“設計模式”,其自身也與“面向對象”沒有直接的關系。我覺得很多人之所以不能很準確地理解IoC源于他們忽略了一個最根本的東西,那就是IoC這個短語,也就是他們之所以對IoC產生了諸多誤解是因為他們忽略了IoC的定義。

IoC的全名Inverse of Control,翻譯成中文就是“控制反轉”或者“控制倒置”。控制反轉也好,控制倒置也罷,它體現的意思是控制權的轉移,即原來控制權在A手中,現在需要B來接管。那么具體對于軟件設計來說,IoC所謂的控制權的轉移具有怎樣的體現呢?要回答這個問題,就需要先了解IoC的C(Control)究竟指的是怎樣一種控制。對于我們所在的任何一件事,不論其大小,其實可以分解成相應的步驟,所以任何一件事都有其固有的流程,IoC涉及的所謂控制可以理解為“針對流程的控制”。

我們通過一個具體事例來說明傳統的設計在采用了IoC之后針對流程的控制是如何實現反轉的。比如說現在設計一個針對Web的MVC類庫,我們不妨將其命名為MvcLib。簡單起見,這個類庫中只包含如下這個同名的靜態類。

public static class MvcLib

{
    public static Task ListenAsync(Uri address);
    public static Task ReceiveAsync();
    public static Task CreateControllerAsync(Request request);
    public static Task ExecuteControllerAsync(Controller controller);
    public static Task RenderViewAsync(View view);
}

MvcLib提供了如上5個方法幫助我們完成整個HTTP請求流程中的5個核心任務。具體來說,ListenAsync方法啟動一個監聽器并將其綁定到指定的地址進行HTTP請求的監聽,抵達的請求通過ReceiveAsync方法進行接收,我們將接收到的請求通過一個Request對象來表示。CreateControllerAsync方法根據接收到的請求解析并激活請求的目標Controller對象。ExecuteControllerAsync方法執行激活的Controller并返回一個表示視圖的View對象。RenderViewAsync最終將View對象轉換成HTML并作為當前請求響應的內容返回給請求的客戶端。

現在我們在這個MvcLib的基礎上創建一個真正的MVC應用,那么除了按照MvcLib的規范自定義具體的Controller和View之外,我們還需要自行控制從請求的監聽與接收、Controller的激活與執行以及View的最終呈現在內的整個流程,這樣一個執行流程反映在如下所示的代碼中。

class Program

{
    static async Task Main()
    {
         Uri address = new Uri("http://0.0.0.0:8080/mvcapp");
         await MvcLib.ListenAsync(address);
         while (true)
        {
            var request = await MvcLib.ReceiveAsync();
            var controller = await MvcLib.CreateControllerAsync(request);
            var view = await MvcLib.ExecuteControllerAsync(controller);
            await MvcLib.RenderViewAsync(view);
        }
    }    
}

這個例子體現了如圖1所示的流程控制方式(應用的代碼完全采用異步的方式來處理請求,為了讓流程圖顯得更加簡單,我們在流程圖中畫成了同步的形式,讀者不必糾結這個問題)。我們設計的類庫(MvcLib)僅僅通過API的形式提供某種單一功能的實現,作為類庫消費者的應用程序(App)則需要自行編排整個工作流程。如果從重用的角度來講,這里被重用的僅限于實現某個環節單一功能的代碼,編排整個工作流程的代碼并沒有得到重用。

圖1 流程控制掌握在應用程序手中

但是當我們構建一個應用的時候,我們需要的不僅僅是一個能夠提供單一API的類庫,我們希望的理想形式是能夠直接在一個現有的框架上構建我們的應用。類庫(Library)和框架(Framework)的不同之處在于,前者往往只是提供實現某種單一功能的API,而后者則針對一個目標任務對這些單一功能進行編排形成一個完整的流程,這個流程在一個引擎的驅動下自動執行。

對于我們上面演示MvcLib來說,作為消費者的應用程序需要自行控制整個HTTP請求的處理流程,但這是實際上這是一個很“泛化”的工作流程,幾乎所有的MVC應用均采用這樣的流程監聽、接收請求并最終對請求予以響應。如果我們將這個流程實現在一個MVC框架之中,由它構建的所有MVC應用就可以直接使用這個請求處理流程,而不需要自行重復實現它。

現在我們將MvcLib從類庫改造成一個框架,并姑且將其稱為MvcFrame。如圖2所示,MvcFrame的核心是一個被稱為MvcEngine的執行引擎,它驅動一個編排好的工作流對HTTP請求進行一致性處理。如果我們利用MvcFrame構建一個具體的MVC應用,除了根據我們的業務需求定義相應的Controller和View之外,我們只需要初始化這個引擎并直接啟動它即可。如果你曾經開發過ASP.NET MVC應用,你會發現ASP.NET MVC就是這么一個框架。

圖2 流程控制反轉到框架手中

有了上面演示的這個例子作為鋪墊,我們應該很容易理解IoC所謂的控制反轉。總的來說,IoC是我們設計框架所采用的一種基本思想,所謂的控制反轉就是將對應用流程的控制轉移到框架中。拿上面這個例子來說,在傳統面向類庫編程的時代,針對HTTP請求處理的流程牢牢控制在應用程序手中。在引入框架之后,請求處理的控制權轉移到了框架手上。

二、好萊塢法則

在好萊塢,把簡歷遞交給演藝公司后就只有回家等待。由演藝公司對整個娛樂項目的完全控制,演員只能被動式的接受電影公司的工作,在需要的環節中,完成自己的演出。“不要給我們打電話,我們會給你打電話(don‘t call us, we‘ll call you)”這是著名的好萊塢法則( Hollywood Principle或者 Hollywood Low),IoC完美地體現了這一法則。

圖3 好萊塢法則

在IoC的應用語境中,框架就像是掌握整個電影制片流程的電影公司,由于它是整個工作流程的實際控制者,所以只有它知道哪個環節需要哪些組件。應用程序就像是演員,它只需要按照框架定制的規則注冊這些組件就可以了,因為框架會在適當的時機字典加載并執行注冊的組件。

以熟悉的ASP.NET Core MVC或者ASP.NET MVC應用開發來說,我們只需要按照約定規則(比如目錄結構和命名等)定義相應的Controller類型和View文件就可以了。當ASP.NET (Core )MVC框架在進行處理請求的過程中,它會根據解析生成的路由參數定義為對應的Controller類型,并按照預定義的規則找到我們定義的Controller,然后自動創建并執行它。如果定義在當前Action方法需要呈現一個View,框架自身會根據預定義的目錄約定找到我們定義的View文件,并對它實施動態編譯和執行。整個流程處處體現了“框架Call應用”的好萊塢法則。

總的來說,我們在一個框架的基礎上進行應用開發,就相當于在一條調試好的流水線上生成某種商品,我們只需要在相應的環節準備對應的原材料,最終下線的就是我們希望得到的最終產品。IoC幾乎是所有框架均具有的一個固有屬性,從這個意義上講,“IoC框架”的說法其實是錯誤的,世界上并沒有什么IoC框架,或者說幾乎所有的框架都是IoC框架。

三、流程定制

我們采用IoC實現了流程控制從應用程序向框架自身的反轉,但是這個被反轉的僅僅是一個泛化的流程,任何一個具體的應用都可能需要對組成該流程的某些環節進行定制。還是以我們的MVC框架來說,可能默認的請求處理流程只考慮到針對HTTP 1.1的支持,但是當我們在設計框架的時候應該提供相應的擴展點來支持HTTP 2。作為一個Web框架,用戶認證功能是必備的,但是框架自身不能限制于某一種或者幾種固定的認證方式,應該通過擴展的方式讓用戶可以自由地定制任意的認證模式。

我們可以說得更加寬泛點。如圖4所示,我們將一個泛化的工作流程(A=>B=>C)被定義在框架之中,建立在該框架的兩個應用需要對組成這個流程的某些環節進行定制。比如步驟A和C可以被App1重用,但是步驟B卻需要被定制(B1),App2則重用步驟A和B,但是需要按照自己的方式處理步驟C。

圖4 應用程序對流程的定制

IoC將對流程的控制從應用程序轉移到框架之中,框架利用一個引擎驅動整個流程的執行,應用程序無需關心該工作流程的細節,它只需要啟動這個引擎即可。但是這個引擎一旦被啟動,框架就會完全按照預先編排好的流程進行工作,如果應用程序希望整個流程按照自己希望的方式被執行,針對流程的定制一般在發生在啟動引擎之前。

一般來說,框架會以相應的形式提供一系列的擴展點,應用程序則通過定義擴展的方式實現對流程某個環節的定制。在引擎被啟動之前,應用程序將所需的擴展注冊到框架之中。一旦引擎被正常啟動,這些注冊的擴展會自動參與到整個流程的執行過程中。

綜上所述,IoC一方面通過流程控制從應用程序向框架的反轉實現了針對流程自身的重用,另一方面通過內置的擴展機制這個被重用的流程可能自由地被定制,這兩個因素決定了框架自身的價值。重用讓框架不僅僅是為應用程序提供實現單一功能的API,而是提供一整套可執行的解決方案,可定制則使我們可以為不同的應用程序對框架進行定制,這無疑讓框架可以使用到更多的應用之中。
編輯:hfy

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 無服務器
    +關注

    關注

    0

    文章

    18

    瀏覽量

    4189
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    利用XStream Browser加快示波器程控設計

    所有基于 Windows 系統的TeledyneLeCroy “XStream” 系列儀器均完全支持基于微軟組件對象模型(COM)的自動化接口控制。通過 COM 技術,控制應用程序可直接在儀器上運行
    的頭像 發表于 01-24 11:32 ?5468次閱讀
    利用XStream Browser加快示波器<b class='flag-5'>程控</b>設計

    什么是WiFi遠程控制模塊?技術特點和應用場景有哪些?

    便捷和高效。無論是通過手機APP、電腦終端,還是智能語音助手,WiFi遠程控制模塊都能夠幫助用戶實現實時、遠程操作,提升生活質量與工作效率。 什么是WiFi遠程控制模塊? WiFi遠程控制
    的頭像 發表于 11-29 14:10 ?485次閱讀
    什么是WiFi遠<b class='flag-5'>程控制</b>模塊?技術特點和應用場景有哪些?

    電能質量在線監測裝置的備用鏈路切換機制是否支持遠程控制

    現代電能質量在線監測裝置的備用鏈路切換機制 普遍支持遠程控制 ,主流廠商通過協議指令、軟件平臺和硬件冗余設計,實現了從鏈路狀態查詢、策略配置到強制切換的全流程遠程操作。以下是技術實現
    的頭像 發表于 11-06 16:48 ?1410次閱讀

    PYQT 應用程序框架及開發工具

    大家好,本團隊此次分享的內容為開發過程中使用到的PYQT 應用程序框架及開發工具。 pYqt 是一個多平臺的 python 圖形用戶界面應用程序框架,由于其面向對象、 易擴展(可實現組件編程等
    發表于 10-29 07:15

    NVMe高速傳輸之擺脫XDMA設計28: TLP 事務處 理程序的執行流程

    程序的執行流程圖當對應任務接口的事務緩存中存在未處理事務時, 處理程序從緩存中獲取事務。首先檢查事務類型, 當事務類型為 Cpl 響應類型事務時, 如果當前
    發表于 09-21 08:51

    學生適合使用的SOLIDWORKS 云應用程序

    隨著科技的不斷發展,計算機輔助設計(CAD)技術已經成為現代工程教育的重要組成部分。SOLIDWORKS作為一款CAD軟件,其教育版云應用程序為學生提供了強大而靈活的設計平臺。本文將探討
    的頭像 發表于 09-15 10:39 ?791次閱讀
    學生適合使用的SOLIDWORKS 云<b class='flag-5'>應用程序</b>

    宏集方案 | 如何選擇適合您的過程控制器?

    在現代工業中,過程控制器是確保生產效率、質量和安全性的關鍵設備。它們可以精準監測溫度、濕度等變量,優化制造流程,減少人工干預,從而降低錯誤率和運營成本。但您是否清楚,哪種過程控制器更適合您的企業
    的頭像 發表于 08-08 18:12 ?435次閱讀
    宏集方案 | 如何選擇適合您的過<b class='flag-5'>程控制</b>器?

    告別布線煩惱!御控智能網關實現工業PLC無線遠程控制終極指南

    工廠設備PLC布線復雜、改造困難、移動受限,御控工業智能網關,無需挖溝鋪線,輕松實現工業自動化PLC無線遠程控制!讓設備操控自由無界,運維效率飛躍提升!
    的頭像 發表于 07-09 16:15 ?622次閱讀

    是德示波器MSOX3054T遠程控制自動化測試

    實現自動化測試,助力測試流程的智能化升級。 ? 一、MSOX3054T的核心優勢:遠程控制的基礎 MSOX3054T示波器具備出色的信號采集與分析能力,其高頻帶寬、高采樣率及深存儲深度,使其適用于復雜信號的精確測量。而遠
    的頭像 發表于 07-08 17:09 ?653次閱讀
    是德示波器MSOX3054T遠<b class='flag-5'>程控制</b>自動化測試

    如何使用無線遠程控制模塊來實現rs-485無線控制

    無線遠程控制模塊,是一種在工業自動化、遠程監控等領域廣泛應用的技術。以下將主要介紹無線遠程控制模塊及其在實現485無線控制中的應用。 一、無線遠程控
    的頭像 發表于 04-24 17:08 ?1044次閱讀
    如何使用無線遠<b class='flag-5'>程控制</b>模塊來<b class='flag-5'>實現</b>rs-485無線<b class='flag-5'>控制</b>?

    普源示波器遠程控制SCPI指令的應用

    Commands for Programmable Instruments)指令作為標準化的控制語言,為普源示波器的遠程控制提供了強有力的支持。本文將深入探討普源示波器遠程控制SCPI指令的應用,包括其基本概念、常用指令、應用
    的頭像 發表于 04-22 15:55 ?1273次閱讀
    普源示波器遠<b class='flag-5'>程控制</b>SCPI指令的應用

    如何選擇適合您的過程控制器?

    在現代工業中,過程控制器是確保生產效率、質量和安全性的關鍵設備。它們可以精準監測溫度、濕度等變量,優化制造流程。但您是否清楚如何選擇合適的過程控制器?
    的頭像 發表于 04-18 17:54 ?668次閱讀
    如何選擇適合您的過<b class='flag-5'>程控制</b>器?

    吉事勵1000V交流程控電源高壓穩定性高

    2025年市場上主流的1000V交流程控電源產品以高精度、可編程控制及寬電壓調節為核心,以下為關鍵信息匯總: 一、為什么高電壓場景更怕電源波動? “當測試電壓突破1000V,1%的偏差就意味著10V
    的頭像 發表于 04-17 15:19 ?599次閱讀

    高速ssd存儲系統中數據緩存控制流程控制設計

    高速SSD系統中流程控制模塊設計。該模塊主要由寄存器、讀狀態機、寫狀態機和命令生成模塊組成,系統介紹各模塊功能。
    的頭像 發表于 04-14 10:43 ?844次閱讀
    高速ssd存儲系統中數據緩存<b class='flag-5'>控制</b>器<b class='flag-5'>流程控制</b>設計

    智慧路燈如何實現程控制

    引言 在智慧城市建設的進程中,叁仟智慧路燈作為重要的基礎設施,其遠程控制功能發揮著關鍵作用。遠程控制使得叁仟智慧路燈能夠擺脫地域限制,實現高效、精準的管理,極大地提升了城市照明系統的運行效率與智能化
    的頭像 發表于 03-18 12:27 ?1027次閱讀
    智慧路燈如何<b class='flag-5'>實現</b>遠<b class='flag-5'>程控制</b>?