最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ASP.NET Core如何注入多個服務(wù)實現(xiàn)類

 更新時間:2021年09月09日 11:35:32   作者:東邪獨孤  
這篇文章主要介紹了ASP.NET Core如何注入多個服務(wù)實現(xiàn)類的相關(guān)資料,需要的朋友可以參考下面文章的具體內(nèi)容

前言:

依賴注入在 ASP.NET Core 中起中很重要的作用,也是一種高大上的編程思想,它的總體原則就是:俺要啥,你就給俺送啥過來。服務(wù)類型的實例轉(zhuǎn)由容器自動管理,無需我們在代碼中顯式處理。

因此,有了依賴注入后,你的編程思維就得變一變了。在過去,許多功能性的類型(比如一個加密解密的類),我們都喜歡將其定義為靜態(tài)(static),而有了依賴注入,你就要避免使用靜態(tài)類型,應(yīng)該交由服務(wù)容器幫你管理,只要你用好了,你會發(fā)現(xiàn)依賴注入是很方便的。

依賴注入的初級玩法,也是比較標(biāo)準(zhǔn)的玩法,此種玩法有兩種模式:

  1. 十代單傳模式:一個接口對應(yīng)一個類,比如先定義接口 IA、IB,隨后,類A實現(xiàn) IA,類B 實現(xiàn) IB。一對一。也可以是抽象類(或基類)E,然后 F 繼承 E 類。
  2. 斷子絕孫模式:直接就寫一個類,不考慮派生,直接就添加到服務(wù)容器中。

來,看個例子。

1、定義個接口

    public interface IPlayGame
    {
        void Play();
    }


然后,寫一個類來實現(xiàn)它。

    public class NBPlayGame : IPlayGame
    {
        public void Play()
        {
            Console.WriteLine("全民打麻藥。");
        }
    }

我們知道,所謂服務(wù)類,其實就是普通類,這些類一般用于完成某些功能,比如計算 MD5 值。接著呢,還記得 Startup 類有個 ConfigureServices 方法吧,對,就在這廝里面把我們剛剛那個服務(wù)進(jìn)行注冊(就是添加到 ServiceCollection 集合中)。

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddTransient<IPlayGame, NBPlayGame>();
        }


添加的時候很簡單,類型一對一,IPlayGame 接口與 NBPlayGame 類對應(yīng)。添加時有三種方法你可以調(diào)用,實際上對應(yīng)著,服務(wù)類在容器中的生命周期。

  • AddSingleton:單個實例,這是壽命最長的,與天同壽。整個應(yīng)用程序中僅用一個實例。
  • AddTransient:這個是最短命的,可能是天天晚上加班熬夜,死得很快。此種情況下,服務(wù)類的實例是用的時候創(chuàng)建,用完后直接銷毀。
  • AddScoped:這個比較難理解。它的生命周期在單個請求內(nèi),包括客戶端與服務(wù)器之間隨后產(chǎn)生的子請求,反正只要請求的會話結(jié)束了,就會清理。

2、注入服務(wù)

比如在中間件,在控制器,或者在其他服務(wù)類的構(gòu)造函數(shù)上(中間件是在 Invoke / InvokeAsync 方法上)進(jìn)行實例接收。

現(xiàn)在來用一下,寫一個中間件。

    public class TestMiddleware
    {
        public TestMiddleware(RequestDelegate next) { }

        public Task InvokeAsync(HttpContext context, IPlayGame game)
        {
            game.Play();
            return Task.CompletedTask;
        }
    }

已注冊的服務(wù)會注入到 InvokeAsync 方法的參數(shù)中。注意第一個參數(shù)是 HttpContext,這是必須參數(shù),后面的是注入的參數(shù)。

最后,在 Startup 類的 Configure 方法中就可以 use 這個中間件了。

        public void Configure(IApplicationBuilder app)
        {
            app.UseMiddleware<TestMiddleware>();
        }
 

運行后,Play 方法調(diào)用,在控制臺中輸出以下結(jié)果

 3、功能類

 也稱“斷子絕孫”模式,不使用接口規(guī)范,直接寫功能類。

    public class DoSomething
    {
        public string GetMessage() => "你好,剛才 Boss 找你。";
    }

注冊服務(wù)時更簡單。

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddScoped<DoSomething>();
        }

在 Configure 方法中進(jìn)行注入。

        public void Configure(IApplicationBuilder app, DoSomething thing)
        {
            Console.WriteLine(thing.GetMessage());
        }


運行后,輸出結(jié)果如下

 

 在容器中,使用 ServiceDescriptor 類來存儲服務(wù)類型相關(guān)的信息。其中,ServiceType 表示的是服務(wù)的類型,如果服務(wù)是有接口與實現(xiàn)類的,那么這個屬性指的是接口的類型,實現(xiàn)類的類型信息由 ImplementationType 屬性存儲。如果沒有接口,直接只定義類型,那么這個類型的信息就存到 ServiceType 屬性上,ImplementationType 屬性不使用。

上面這些例子中,ServiceType 是 IPlayGame 接口相關(guān)信息,ImplementationType 是 NBPlayGame 類的信息。如果像上面 DoSomething 類的情況,則 ServiceType 為 DoSomething 相關(guān)的信息,ImplementationType 為空。

 4、高級類

接下來,咱們看高級玩法。

定義一個接口。

    public interface IDemoService
    {
        string Version { get; }
        void Run();
    }


然后,有兩個類實現(xiàn)這個接口。

    public class DemoService1 : IDemoService
    {
        public string Version => "v1";

        public void Run()
        {
            Console.WriteLine("第一個服務(wù)實現(xiàn)類。");
        }
    }

    public class DemoService2 : IDemoService
    {
        public string Version => "v2";

        public void Run()
        {
            Console.WriteLine("第二個服務(wù)實現(xiàn)類。");
        }
    }

然后,我們注冊服務(wù)。

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddTransient<IDemoService, DemoService1>();
            services.AddTransient<IDemoService, DemoService2>();
        }


然后我們照例,接收注入,咱們依舊使用中間件的方法參數(shù)接收。

    public class DemoMiddleware
    {
        public DemoMiddleware(RequestDelegate next)
        {
            // 由于程序約定,此構(gòu)造函數(shù)必須提供。
        }

        public async Task InvokeAsync(HttpContext context, IDemoService sv)
        {
            await context.Response.WriteAsync(sv.Version);
        }
    }

然后,在 Startup.Configure 方法中使用該中間件。

        public void Configure(IApplicationBuilder app, DoSomething thing)
        {
            app.UseMiddleware<DemoMiddleware>();
        }


運行之后,你發(fā)現(xiàn)問題了,看看輸出。

 

 出事了,參數(shù)僅能接收到最后注冊的實現(xiàn)類型實例,也就是 DemoService2 類。所以就看到網(wǎng)上有不少朋友發(fā)貼問了,.NET Core 是不是不支持多個服務(wù)實現(xiàn)類的注入?這難倒了很多人。

實話告訴你,Core Core 兄是支持注入多個實現(xiàn)類的實例的。

下面,老周介紹兩種解決方法(其實有三種,還有一種不太好弄,尤其是你對 Core 兄不熟的時候,所以我說兩種,基本夠用)。

方法一、接收 IServiceProvider 類型的注入。

        public async Task InvokeAsync(HttpContext context, IServiceProvider provider)
        {
            StringBuilder sb = new StringBuilder();
            foreach (var sv in provider.GetServices<IDemoService>())
            {
                sb.Append($"{sv.Version}<br/>");
            }
            await context.Response.WriteAsync(sb.ToString());
        }

只要能接收到 IServiceProvider 所引用的實例,就能通過 GetServices 方法獲取多個服務(wù)實例。

方法二,這種方法老周很推薦,更簡單,直接注入 IEnumerable<T> 類型,本例中就是 IEnumerable<IDemoService>。

        public async Task InvokeAsync(HttpContext context, IEnumerable<IDemoService> svs)
        {
            StringBuilder sb = new StringBuilder();
            foreach (var sv in svs)
            {
                sb.Append($"{sv.Version}<br/>");
            }
            await context.Response.WriteAsync(sb.ToString());
        }

IEnumerable<T> 的妙處就是可以 foreach ,這樣你也能訪問多個實例,而且必要時還可以聯(lián)合 LINQ 一起耍。

運行結(jié)果如下。

 

到此這篇關(guān)于ASP.NET Core如何注入多個服務(wù)實現(xiàn)類的文章就介紹到這了,更多相關(guān)ASP.NET Core何注多個服務(wù)實現(xiàn)類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • .NET6新特性之 隱式命名空間引用

    .NET6新特性之 隱式命名空間引用

    本文給大家分享的是 .NET6特新 隱式命名空間引用,如果我們要在新加一個命名空間的引用,可以在項目文件中配置增加<Using Include="命名空間"/>,如果需要移除一個命名空間可以這么做<Using Remove="命名空間"/>,下面來看看文章詳細(xì)介紹內(nèi)容吧,需要的朋友可以參考一下
    2021-11-11
  • 簡單實現(xiàn).NET?Hook與事件模擬實例

    簡單實現(xiàn).NET?Hook與事件模擬實例

    這篇文章主要為大家介紹了簡單實現(xiàn).NET?Hook與事件模擬實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • ASP遺留的二十個積習(xí)

    ASP遺留的二十個積習(xí)

    ASP遺留的二十個積習(xí)
    2006-07-07
  • 使用Asp.net Mvc3 Razor視圖方式擴展JQuery UI Widgets方法介紹

    使用Asp.net Mvc3 Razor視圖方式擴展JQuery UI Widgets方法介紹

    jquery easyui grid或者extjs grid,jtable的代碼非常簡潔、對于grid功能要求不是很復(fù)雜的情況下,強烈推薦大家使用
    2012-11-11
  • .net程序開發(fā)IOC控制反轉(zhuǎn)和DI依賴注入詳解

    .net程序開發(fā)IOC控制反轉(zhuǎn)和DI依賴注入詳解

    這篇文章主要為大家介紹了.net程序開發(fā)IOC控制反轉(zhuǎn)和DI依賴注入示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • .NET 6中使用DateOnly和TimeOnly類型

    .NET 6中使用DateOnly和TimeOnly類型

    這篇文章主要介紹了.NET 6中使用DateOnly和TimeOnly類型,在.NET 6(preview 4)中引入了兩個期待已久的類型,將作為核心庫的一部分。DateOnly和TimeOnly允許開發(fā)人員表示DateTime的日期或時間部分,下文具體內(nèi)容,需要的小伙伴可以參考一下
    2022-01-01
  • 利用.NET 開發(fā)服務(wù)器 應(yīng)用管理工具

    利用.NET 開發(fā)服務(wù)器 應(yīng)用管理工具

    這篇文章主要介紹如何利用.NET 開發(fā)一個應(yīng)用管理工具的服務(wù)器,文章回先聊背景接著其是喲美好方法,需要的的小伙伴可以參考一下小面文章的具體內(nèi)容
    2021-10-10
  • .Net性能調(diào)優(yōu)-ArrayPool詳情

    .Net性能調(diào)優(yōu)-ArrayPool詳情

    ArrayPool具有高性能 托管 數(shù)組緩沖池,可重復(fù)使用,用 租用 空間的方式代替 重新分配 數(shù)組空間的行為的特點及可以在頻繁創(chuàng)建和銷毀數(shù)組的情況下 提高性能 ,減少垃圾回收器的壓力的優(yōu)點,下面文章內(nèi)容將詳細(xì)對其做介紹,需要的朋友可以參考一下
    2021-09-09
  • asp.net mvc路由篇 如何找到 IHttpHandler方法介紹

    asp.net mvc路由篇 如何找到 IHttpHandler方法介紹

    學(xué)習(xí)是使用asp.net已經(jīng)有很長一段時間了,現(xiàn)在就來分析一下mvc的整過過程吧。個人計劃寫一個mvc系列的博文,僅從源代碼的角度來分析mvc。在接觸mvc時我們一定會經(jīng)歷路由,那么路由這東東是怎么搞出來的啊
    2012-11-11
  • ASP.NET Core MVC 過濾器(Filter)

    ASP.NET Core MVC 過濾器(Filter)

    本文小編要給大家介紹的是ASP.NET Core MVC 過濾器,ASP.NET MVC 中的過濾器允許在執(zhí)行管道中的特定階段之前或之后運行代碼??梢詫θ郑部梢詫γ總€控制器或每個操作配置過濾器,需要的朋友可以參考下面文章的具體內(nèi)容
    2021-09-09

最新評論

漾濞| 福泉市| 张家川| 宁远县| 阿图什市| 长子县| 麦盖提县| 麻城市| 佛山市| 孟连| 师宗县| 泰和县| 武强县| 林甸县| 赤壁市| 梓潼县| 南郑县| 迭部县| 沧源| 西青区| 河北省| 香港| 肃北| 江津市| 云梦县| 乌审旗| 灵丘县| 巴东县| 舒城县| 余姚市| 洛宁县| 德钦县| 陇南市| 周至县| 嘉禾县| 略阳县| 富平县| 平和县| 雷州市| 南安市| 凤山市|