Asp.net core 學習筆記--(1)依賴注入


依賴注入

依賴注入是一種軟件的設計技巧,它主要解決的是類與類之間的耦合,這種設計技巧滿足面向對象設計的”依賴倒置“原則:類與類之間不相互依賴,都要依賴接口。比如說controller中需要一個”AccessDataBase“的類型來進行對數據庫的檢索,那么我們可以將這個AccessDataBase類中實現的功能做成一個接口,然后讓這個類去實現這個接口,然后,我們在需要這個類的地方(本例中是controller)給他塞進去一個接口,然后通過DI容器去提供具體的實現。DI容器就是這個一個東西。
asp.net core 內置了依賴注入,主要是通過Microsoft.Extensions.DependencyInjection的nuget包來實現的。
DI容器就是一個由IServiceProvider的接口來實現的:

 public interface IServiceProvider
{
object GetService(Type serviceType);
}

這個接口看起來很簡潔,其實我們用到的主要是這個接口的一些擴展方法
一個IServiceProvider要通過IServiceCollection這個接口來生成,這個接口在asp.net core中有具體實現,就是一個ServiceCollection。
如果要生成一個IServiceProvider,可以通過下面的代碼來實現:

IServiceProvider service=new ServiceCollection().BuildServiceProvider();

這個是最簡單的一種實現,因為在這個實現的過程中根本沒有注冊任何內容。

生命周期

DI容器除了提供接口的具體實現,還要去管理這個具體實現的生命周期。由DI容器生成的類就叫做”提供的服務“。提供的類是”服務“。
IServiceProvider就是asp.net core中的DI容器,它提供的服務是以三種不同形式的生命周期來實現的,這三種生命周期被放到一個枚舉中:

 public enum ServiceLifetime
{
//
// 摘要:
// Specifies that a single instance of the service will be created.
Singleton = 0,
//
// 摘要:
// Specifies that a new instance of the service will be created for each scope.
//
// 備注:
// In ASP.NET Core applications a scope is created around each server request.
Scoped = 1,
//
// 摘要:
// Specifies that a new instance of the service will be created every time it is
// requested.
Transient = 2
}

Singleton :單例類,應用程序中所有的地方只會出現一個,這個類的實例會被DI容器重復提供直到應用程序終止。
Transient:這個和singleton正好相反。只要調用它的地方就會被DI容器生成一個新的實例(服務)。
Scoped :這個是在每一個DI容器中是唯一的,意思就是說如果應用程序中產生了多個DI容器,那么針對每個DI容器的請求都會生成一個唯一的Scoped的服務。
而提到IServiceProvider就不得不說IServiceScope,具體IServiceProvider提供的服務的生命周期是由IServiceScope來決定的,而IServiceScope是由IServiceScopeFactory來提供的。
剛才說了IServiceProvider可以由一個ServiceCollection來實現,還有一種方法是由IServiceProvider配合IServiceScope來實現:

 static void Main(string[] args)
{

IServiceProvider root=new ServiceCollection().BuildServiceProvider();
IServiceProvider child = root.GetService<IServiceScopeFactory>().CreateScope().ServiceProvider;
}

關鍵是我們先要產生一個serviceprovider,然后用這個serviceprovider來產生另一個,這樣,就形成了一種貌似”父子關系“:例如上面代碼中的root和child。最終,我們會利用這個關系來闡述最后一個問題:serviceprovider對於其所提供的類的生命周期的管理:
singleton:這中生命周期類型的服務的生命周期會被”父親“來進行管理。其他兩種生命周期類型的服務會在各自生成的serviceprovider中進行管理。需要注意的是服務的終止是在IServiceProvider調用Dispose方法的時候自動進行的。但是這種做法也是有缺點的,那就是服務類不會得到及時的回收,一種更好的做法是通過IServiceScope:

using(IServiceScope scope=IServiceProvider.GetService<IServiceScopeFactory>().CreateScope()){
IServiceProvider service=Scope.ServiceProvider;
。。。。。。
}

以上是偽代碼。

在這片文章中IServiceProvider和DI容器和ServiceProvider是一個意思。特此說明。
這篇文章會隨着我對asp.net core的理解逐步加入更多的東西,目的就是為了做好這個筆記以供后期復習。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com