成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

.net程序開發IOC控制反轉和DI依賴注入詳解

瀏覽:224日期:2022-06-09 10:17:57
目錄
  • IOC控制反轉
  • DI依賴注入
  • 服務生命周期
  • 其它

IOC控制反轉

大部分應用程序都是這樣編寫的:編譯時依賴關系順著運行時執行的方向流動,從而生成一個直接依賴項關系圖。 也就是說,如果類 A 調用類 B 的方法,類 B 調用 C 類的方法,則在編譯時,類 A 將取決于類 B,而 B 類又取決于類 C

應用程序中的依賴關系方向應該是抽象的方向,而不是實現詳細信息的方向。而這就是控制反轉的思想。

應用依賴關系反轉原則后,A 可以調用 B 實現的抽象上的方法,讓 A 可以在運行時調用 B,而 B 又在編譯時依賴于 A 控制的接口(因此,典型的編譯時依賴項發生反轉)。 運行時,程序執行的流程保持不變,但接口引入意味著可以輕松插入這些接口的不同實現。

上下不同的實現方式在于之前的依賴關系是A->B->C,控制反轉后A->B接口->C接口,然后具體的B,C實現又是B->B接口 的反轉依賴。這樣的好處就是A只依賴B接口而不是依賴實現,具體我們要實現什么只需要按照業務需求進行編寫,并且可以隨時替換實現而不會影響A的實現,這種思想就是控制反轉。

如下是順序依賴:

public class A{    //依賴具體類    public B b;    public C c;    public A(B _b, C _c) {b = _b;c = _c;    }    public void Listen()    {b.SayHi();c.SayBye();    }}public class B{    public void SayHi()    {Console.WriteLine("hi...");    }}public class C{    public void SayBye()    {Console.WriteLine("bye...");    }}

如下是控制反轉:

public class A{    //依賴接口    public IB b;    public IC c;    public A(IB _b, IC _c)    {b = _b;c = _c;    }    public void Listen()    {b.SayHi();c.SayBye();    }}public interface IB{    public void SayHi();}public interface IC{    public void SayBye();}

DI依賴注入

.NET 支持依賴關系注入 (DI) 軟件設計模式,這是一種在類及其依賴項之間實現控制反轉 (IoC) 的技術。
我們首先用代碼來看什么是DI,在.net提供的擴展包Microsoft.Extensions.DependencyInjection中來完成DI,nuget安裝。

然后我們實現接口B和接口C,實現我們可以說英語,也可以說漢語,我們在SayHi和SayBye中輸出漢語。

public class B : IB{    public void SayHi()    {Console.WriteLine("你好...");    }}public class C : IC{    public void SayBye()    {Console.WriteLine("再見...");    }}

然后在服務容器中注冊依賴關系。 .NET 提供了一個內置的服務容器 IServiceProvider。 服務通常在應用啟動時注冊,并追加到 IServiceCollection。 添加所有服務后,可以使用 BuildServiceProvider 創建服務容器,然后在容器中直接“要”對象而不用去管它如何實例化,并且DI具備傳染性,假如B引用了D接口ID,那么我們注冊B并在獲取B實例時,引用的D接口也會被實例化。

    //IServiceCollection 服務    IServiceCollection services = new ServiceCollection();    //服務注冊    services.AddTransient<A>();    services.AddTransient<IB, B>();    services.AddTransient<IC, C>();    //創建服務容器    var serviceProvider = services.BuildServiceProvider();    //獲取服務    var a = serviceProvider.GetRequiredService<A>();    //使用    a.Listen();    Console.ReadKey();

這就是通過DI依賴注入的方式來實現IOC的思想,或許你會好奇為什么我們不直接實例化A,然后在構造方法里面傳進去就行了,也就不依賴DI實現了。但是程序結構更復雜些呢,比如上面提到的B又有D,D又有F呢,這樣在構造的時候不是一直要new很多對象,而且同一個接口的不同實現還要去找實例化處的代碼進行修改。例如SayHI我想說英文呢?那么我們就可以實現一個BB,然后在服務注冊的地方注冊BB就可以了。

public class BB : IB{    public void SayHi()    {Console.WriteLine("hello...");    }}

替換注冊BB services.AddTransient<IB, BB>(),而不用去改任何邏輯。

服務生命周期

在注冊服務的時候我使用的AddTransient方法,表示注冊的服務是瞬態的,也就是每次請求都是重新創建實例。同時還提供其它注冊服務的方法。

服務有三種聲明周期:

瞬態

作用域

單例

  • 瞬態

服務是每次從服務容器進行請求時創建的。 這種生存期適合輕量級、 無狀態的服務。 用 AddTransient 注冊服務。在處理請求的應用中,在請求結束時會釋放暫時服務。

  • 作用域

指定了作用域的生存期指明了每個客戶端請求(連接)創建一次服務。 向 AddScoped 注冊范圍內服務。在處理請求的應用中,在請求結束時會釋放有作用域的服務。

想asp.net 在處理一個請求的時候是一個作用域,同樣我們自己也可以定義作用域。使用serviceProvider.CreateScope()創建作用域,在作用域釋放后對象將被釋放。

我們使用AddScoped添加對象,然后在作用域中取兩個A對象進行比較,可以看到是True

如果我們用AddTransient注冊A,即使在作用域內兩個對象比較也是不一樣的,結果為False

  • 單例

單例大家應該好理解,就是設計模式中的單例,使用AddSingleton 注冊,在首次請求它們時進行創建;或者在向容器直接提供實現實例時由開發人員進行創建。 很少用到此方法,因為可能是線程不安全的,如果服務中有狀態。

其它

在Microsoft.Extensions.DependencyInjection中只能用構造函數注入,其它框架還提供屬性注入,比如autofac。至于原因不得而知,當然也看個人喜好。查了些資料說是構造函數注入更科學,在對象創建的瞬間對象的構造方法將服務實例化,避免邏輯問題。

以上就是.net程序開發IOC控制反轉和DI依賴注入詳解的詳細內容,更多關于.net 控制反轉依賴注入的資料請關注其它相關文章!

標簽: ASP.NET
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
自拍偷在线精品自拍偷无码专区| 国产精品久久夜| 日韩你懂的电影在线观看| 亚洲国产精品一区二区久久恐怖片 | 制服丝袜日韩国产| 亚洲免费在线视频| 91小视频在线免费看| 欧美一区二区视频在线观看| 蜜臀av一区二区三区| 蜜桃久久av| 一区二区在线观看不卡| 激情丁香综合| 国产欧美综合色| 欧美在线二区| 国产三级精品三级在线专区| 99精品国产99久久久久久白柏| 日韩三级视频在线看| 国产黄色精品网站| 777午夜精品免费视频| 国产一区福利在线| 欧美日韩亚洲不卡| 精彩视频一区二区三区| 欧美午夜不卡视频| 蜜桃视频在线一区| 欧美日韩美少妇| 国产在线不卡一区| 欧美丰满美乳xxx高潮www| 精品一区二区三区视频在线观看 | 国产三级精品在线| 91麻豆精品视频| 欧美精品一区二区三| 99国产精品久久久久| xnxx国产精品| 午夜精品久久| 久久久久国产精品免费免费搜索| av爱爱亚洲一区| 久久久不卡网国产精品二区| 91在线观看成人| 国产亚洲精久久久久久| 欧美日本精品| 亚洲乱码一区二区三区在线观看| 国产成人久久精品77777最新版本| 91麻豆精品国产91久久久资源速度| 国产精品综合在线视频| 欧美精品一区二区三区高清aⅴ| 欧美日韩国产不卡在线看| 亚洲人精品午夜| 久久久蜜桃一区二区人| 精品一区二区在线视频| 欧美电影免费观看高清完整版在 | 自拍偷在线精品自拍偷无码专区| 亚洲深爱激情| 秋霞影院一区二区| 欧美一级久久久久久久大片| 99久久精品国产观看| 久久嫩草精品久久久精品| 欧美日本韩国在线| 一区二区三区免费在线观看| 色哟哟一区二区三区| 国产在线观看免费一区| 欧美xxxxx裸体时装秀| 欧美aⅴ99久久黑人专区| 亚洲欧美一区二区视频| 香蕉视频成人在线观看| 精品一区二区在线免费观看| 精品国产91久久久久久久妲己| 欧美视频不卡| 亚洲va在线va天堂| 欧美一区二区啪啪| 亚洲亚洲精品三区日韩精品在线视频| 亚洲精品ww久久久久久p站| 久久九九电影| 成人一区二区三区| 国产精品大尺度| 欧美伊人精品成人久久综合97| 粉嫩一区二区三区性色av| 国产精品国产自产拍高清av | 91久久精品一区二区三| 国产成人精品免费| 日韩一区欧美小说| 欧美日韩精品一区二区在线播放| 成人国产精品免费观看动漫| 自拍偷拍欧美精品| 欧美在线短视频| 色综合天天天天做夜夜夜夜做| 亚洲在线视频一区| 91精品在线麻豆| 亚洲激情偷拍| 国产一区二区三区在线看麻豆| 国产日韩三级在线| 免费欧美在线| 成人h精品动漫一区二区三区| 中文字幕在线不卡一区| 欧美性生活久久| 99精品在线观看视频| 亚洲国产aⅴ成人精品无吗| 日韩一级完整毛片| 在线亚洲欧美| 成人免费看片app下载| 伊人色综合久久天天| 日韩三级电影网址| 久久成人一区| 91丨porny丨首页| 日韩国产成人精品| 久久久久国产一区二区三区四区 | 麻豆国产欧美一区二区三区| 国产欧美一区二区精品性| 一本色道综合亚洲| 91浏览器在线视频| 久久成人免费电影| 亚洲色图欧美偷拍| 欧美大片免费久久精品三p| 国产亚洲精品v| 成人免费不卡视频| 天天综合天天做天天综合| 26uuu精品一区二区在线观看| 久久国产精品一区二区三区四区 | 欧美在线高清| 男女男精品网站| 亚洲欧美日韩人成在线播放| 日韩欧美123| 日本精品免费观看高清观看| 欧美精品偷拍| 国产精品综合视频| 亚洲不卡av一区二区三区| 中文天堂在线一区| 日韩色视频在线观看| 日本精品视频一区二区三区| 在线观看一区视频| 成人免费视频caoporn| 五月天久久比比资源色| 日本一区二区免费在线| 亚洲在线日韩| 99久久精品免费看| 精品一区二区在线免费观看| 亚洲一区影音先锋| 欧美激情在线观看视频免费| 欧美三级乱人伦电影| 妖精视频成人观看www| 欧美一区二区三区四区夜夜大片| 精品亚洲成a人| 亚洲成av人片在线| 国产精品久久久久久久久免费相片 | 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 日本韩国精品在线| 一区二区冒白浆视频| 欧美激情偷拍| 成人小视频免费观看| 久久99精品国产91久久来源| 亚洲一级不卡视频| 国产精品乱人伦中文| 亚洲精品在线免费观看视频| 欧美美女一区二区在线观看| 老牛嫩草一区二区三区日本| 国产精品久久久对白| 亚洲欧洲一二三| 欧美午夜不卡| 欧美一区二区三区久久精品茉莉花| 国产成人在线网站| 久久99热99| 日本美女视频一区二区| 亚洲第一福利视频在线| 亚洲欧洲综合另类| 国产精品久久久久久久久久免费看| 久久奇米777| 日韩欧美的一区| 日韩一级片在线播放| 777欧美精品| 欧美一区二区三区影视| 欧美精品成人一区二区三区四区| 精品视频在线看| 欧美性受xxxx黑人xyx性爽| 91黄色激情网站| 91官网在线观看| 色爱区综合激月婷婷| 色婷婷综合久久久中文字幕| 久久国产日韩欧美| 午夜影院日韩| 久久国产成人| 色婷婷亚洲综合| 色综合久久六月婷婷中文字幕| 久久av在线| 久久在线视频| 色av成人天堂桃色av| 欧美在线小视频| 欧美午夜理伦三级在线观看| 久久成人资源| 色噜噜久久综合| 欧美性感一类影片在线播放| 欧美性色aⅴ视频一区日韩精品| 欧美日韩五月天| 欧美一卡二卡在线观看| 精品国产青草久久久久福利| 精品乱人伦小说| 国产日韩三级在线| 国产精品嫩草影院av蜜臀| 中文字幕一区日韩精品欧美| 亚洲免费观看高清在线观看| 亚洲国产毛片aaaaa无费看| 日韩精品高清不卡|