前言:
想必大家學習.net core的過程中,總會聽到很多名詞,比如:依賴注入,控制反轉,切面編程,DDD領域驅動設計,倉儲等等。今天也是記錄一下,自己學習過程中對依賴注入和控制反轉的理解吧!
1.什么是依賴注入?
提到依賴注入,大家一定會想到控制反轉,怎么了解,控制反轉是一種設計原則(Inversion of Control,縮寫為IoC),而依賴注入((Dependency Injection,簡稱DI))是它的一種實現方式。
2.依賴注入的目的是為了什么?
控制反轉用於解耦,將接口和實現的耦合降低,有一個好處就是,一個接口,可以進行不同的實現,這樣提高擴展性,確保代碼的可維護性和擴展性。通俗的講,就是對象在被使用前,我們需要New一下對象,創建一個實例對象,然后在進行其他操作,依賴注入是針對接口API的。
3.怎么使用?
.net core 自帶了依賴注入的框架,也可以使用第三方DI框架,比如
- Autofac
- DryIoc
- Grace
- LightInject
- Lamar
- Stashbox
- Unity)
本文講講內置DI,使用到的組件包
Microsoft.Extensions.Dependencylnjection.Abstractions
Microsoft.Extensions.Dependency
3.1將接口和實現類使用依賴注入方式添加到容器中
services.AddSingleton<接口,實現類>();【單例】
3.2在構造函數中獲取注入的服務:
這種方式獲取的注入的服務,在整個Controller都可以使用
3.3在視圖中獲取注入的配置服務:
3.4在視圖中獲取注入的服務:
3.5在方法中獲取注入的服務:
Mehtod([FromServices] ITest test)
這種方式獲取的服務是局部變量,使用特別的API調用的服務。
4.核心類型
- IServiceCollection:服務的注冊
- ServiceDescriptor: 注冊服務的信息
- IServiceProvider:容器
- IServiceScope:子容器的生命周期
ServiceLifetime(生命周期):
- Singleton(單例):每次請求的對象都是同一個實例【使用范圍:我們編寫的接口和實現類,一般使用單例模式】
- Scoped(作用域):在一次請求內(作用域內)的對象是一樣的【適用范圍:數據庫的上下文】
- Transient(瞬時【短暫】):每次請求都是一個新對象,比如一個接口,很3個不同實現,每次請求都是三個不同的對象【還沒用到過,用到來補充】
5.注入方式
依賴注入的方式還是有很多,比如常規,泛型,工廠等等。
5.1 常規的注入方式:
services.AddSingleton<接口, 實現類>()
這種方式比較簡單,這里是拿單例模式舉例子,其他模式也是一樣的格式,一個接口可以對應一個實現類,如果你注入2個單例,都是針對一個接口,當你獲取服務的時候,你只會得到一個服務實例,那就是最后注入的那個服務。
5.2 泛型的注入方式:
services.AddSingleton(typeof(泛型接口<>),typeof(泛型實現類<>))
這種方式,說實話我也是第一次使用,有好處,我們不需要指明確定的接口和實現類,而是你看你怎么用,還是貼代碼,請看如下代碼:
services.AddSingleton(typeof(IGroup<>),typeof(Group<>));
一開始還不理解,為什么要使用泛型注入,腦殼開竅了!其實這個泛型注入,是在你注入其他一些接口和現實類之后,想對已經注入一些接口,編寫共同的一個方法,然后調用,這樣可以提高代碼的使用率,還是畫圖吧!
使用泛型注入的好處,大家也可以顯而易見,通過泛型,我們可以在泛型類中定義公共方法,提高代碼的復用!
將類型參數化以達到代碼復用提高軟件開發工作效率的一種數據類型
5.3 工廠的注入方式:
services.AddSingleton<ITest>(serviceProvider=>
{
return new Test001();
});
使用工廠模式,它必須返回的是一個實例對象,serviceProvider【The factory that creates the service】】有GetService(),GetRequiredService,GetServices()方法,可以做一些復雜的組裝(這個還不理解,沒用過,慢慢學習,用到了過來補充)。
總結
通過以上學習,並了解了.net core種使用依賴注入的方式,可以將我們的接口和實現類注入到容器中,后期想要獲取服務,我們可以通過構造控制器的構造函數獲取或直接通過[FromService 接口]獲取服務,依賴注入的方式幫我們解決了調用一個對象,使用new的方式去構建,依賴注入還有3個生命周期進行注入:AddSingleton(單例)、AddScoped(范圍)、AddTransient(瞬時),注入服務可以使用泛型,工廠的方式注冊。