第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 ASP.NET Core 集成測試中覆蓋來自其他容器的 DI 注冊

如何在 ASP.NET Core 集成測試中覆蓋來自其他容器的 DI 注冊

C#
瀟湘沐 2021-11-28 19:46:44
我在 asp.net core startup.cs 文件中有以下注冊:    public void ConfigureContainer(ContainerBuilder builder)    {       builder.RegisterType<UserService>().As<IUserService>();    }這是配置 Autofac 容器。我還有另一個集成測試項目,其中有一個 CustomWebApplicationFactory 類,我正在嘗試替換 IUserService 接口的實現(xiàn)。    protected override void ConfigureWebHost(IWebHostBuilder builder)    {        builder.ConfigureTestServices(services =>        {            services.AddSingleton<IUserService, TestUsersService>();        });    }調試測試項目好像不行,IUserService的實現(xiàn)還是UserService。我嘗試使用 ASP.NET Core 內置 IServiceCollection 直接在 Startup.ConfigureServices 方法中注冊 UserService 并且它在調試時工作:services.AddSingleton<IUserService, UserService>();那么,當我使用 Autofac 作為 IoC 容器并且集成測試項目可以正常工作時,我該如何解決這個問題呢?
查看完整描述

3 回答

?
料青山看我應如是

TA貢獻1772條經驗 獲得超8個贊

您可能會遇到操作順序問題。一般來說,最后的勝利。這適用于 Autofac 和基本的 Microsoft DI 容器。

假設您已閱讀有關 Autofac ASP.NET Core 集成的文檔,您將看到,ConfigureContainer操作順序大致如下:

  • WebHost 特定的 ConfigureServices

  • 啟動類 ConfigureServices

  • 啟動類 ConfigureContainer

在適當?shù)奈恢锰砑?ConfigureTestServices 時,它看起來(雖然我還沒有通過)它在 WebHost 和啟動類 ConfigureServices 之后運行......但它仍然在 ConfigureContainer 之前運行。

這很容易測試 - 創(chuàng)建一個具有三種不同實現(xiàn)的服務接口。在每個級別注冊不同的實現(xiàn)。解析控制器中的接口。你得到了哪一個?那是最后一個運行?,F(xiàn)在從應用程序中刪除該注冊并重試。你得到的下一個是什么?這是倒數(shù)第二個。等等。

Autofac 采用預構建IServicesCollection并循環(huán)遍歷它,將其添加到本機 Autofac 容器中。一旦發(fā)生這種情況,您是否修改集合都沒有關系。Autofac 無法控制 ASP.NET Core 中啟動機制的執(zhí)行順序;它只知道 ASP.NET Core 說:“這是要繼續(xù)導入的最終服務集合!” 如果這不是在正確的階段發(fā)生,您將不得不做以下兩件事之一:

  • 使用 Microsoft 注冊語言而不是本機 Autofac,將您需要覆蓋的注冊移出ConfigureContainer和移入其中一種ConfigureServices方法。

  • 以其他方式執(zhí)行覆蓋,例如使用ASPNETCORE_ENVIRONMENT設置Test和提供ConfigureTestContainer方法。(特定于環(huán)境的注冊方法示例在文檔中。)


查看完整回答
反對 回復 2021-11-28
?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

當像這樣使用 ContainerBuilder 時:


    public void ConfigureContainer(ContainerBuilder builder)

    {

        builder.RegisterType<UserService>().As<IUserService>();

    }

您必須使用 ConfigureTestContainer 而不是 ConfigureTestServices,如下所示:


    protected override void ConfigureWebHost(IWebHostBuilder builder)

    {

        builder.ConfigureTestContainer<ContainerBuilder>(containerBuilder =>

            {

                containerBuilder.RegisterType<TestUsersService>().As<IUserService>();

            });

    }

這是調用ConfigureContainer后執(zhí)行,并會正確地覆蓋IUserService有TestUsersService


查看完整回答
反對 回復 2021-11-28
?
holdtom

TA貢獻1805條經驗 獲得超10個贊

對于來自 google 的那些,我想添加到 Michael 的出色答案中,該答案ConfigureTestContainer不適用于Microsoft從 .NET Core 3.0 開始通過網絡主機推薦的通用主機。然而,Autofac 團隊的 Alistair Evans 提出了一種解決方法。不幸的是,它依賴于IStartupConfigureContainerFilter可能會在 .NET 5.0 中刪除的棄用。

這意味著當前在 .NET 5.0 中,當使用通用主機時,無法在集成測試中模擬外部 DI 容器注入的依賴項。

幸運的是,來自 ASP.NET 團隊的 David Fowler正在調查這個問題。


查看完整回答
反對 回復 2021-11-28
  • 3 回答
  • 0 關注
  • 244 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號