我們知道整個(gè)ASP.NET Core建立在以ServiceCollection/ServiceProvider為核心的DI框架上,它甚至提供了擴(kuò)展點(diǎn)使我們可以與第三方DI框架進(jìn)行整合。對(duì)此比較了解的讀者朋友應(yīng)該很清楚,針對(duì)第三方DI框架的整合可以通過(guò)在定義Startup類(lèi)型的ConfigureServices方法返回一個(gè)ServiceProvider來(lái)實(shí)現(xiàn)。但是真的有這么簡(jiǎn)單嗎?

一、ConfigureServices方法返回的ServiceProvider貌似沒(méi)有用!?

我們可以通過(guò)一個(gè)簡(jiǎn)單的實(shí)例來(lái)說(shuō)明這個(gè)問(wèn)題。我們先定義了如下這個(gè)一個(gè)MyServiceProvider,它實(shí)際上是對(duì)另一個(gè)ServiceProvider的封裝。簡(jiǎn)單起見(jiàn),我們利用一個(gè)字典來(lái)保存服務(wù)接口與實(shí)現(xiàn)類(lèi)型的映射關(guān)系,這個(gè)關(guān)系可以通過(guò)調(diào)用Registe方法來(lái)注冊(cè)。在提供服務(wù)實(shí)例的GetService方法中,如果提供的服務(wù)類(lèi)型已經(jīng)被注冊(cè),我們會(huì)創(chuàng)建并返回對(duì)應(yīng)的實(shí)例對(duì)象,否則我們將利用封裝的這個(gè)ServiceProvider來(lái)提供服務(wù)。為了確保服務(wù)實(shí)例能夠被正常回收,如果服務(wù)類(lèi)型實(shí)現(xiàn)了IDisposable接口,我們會(huì)將它添加到通過(guò)字段_disposables表示的集合中。當(dāng)MyServiceProvider的Dispose方法被調(diào)用的時(shí)候,提供的這些服務(wù)實(shí)例的Dispose方法會(huì)被調(diào)用。

   1: public class MyServiceProvider : IServiceProvider, IDisposable
   2: {
   3:     private IServiceProvider        _innerServiceProvider;
   4:     private Dictionary<Type, Type>  _services;
        		

延伸閱讀

學(xué)習(xí)是年輕人改變自己的最好方式-Java培訓(xùn),做最負(fù)責(zé)任的教育,學(xué)習(xí)改變命運(yùn),軟件學(xué)習(xí),再就業(yè),大學(xué)生如何就業(yè),幫大學(xué)生找到好工作,lphotoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開(kāi)發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)學(xué)習(xí)是年輕人改變自己的最好方式