C# WebApplicationFactory中.NET Core 2.1和3.1之间对ConfigureServices的调用顺序不同

C# WebApplicationFactory中.NET Core 2.1和3.1之间对ConfigureServices的调用顺序不同,c#,asp.net,.net,core,C#,Asp.net,.net,Core,在从.NET Core 2迁移到3的过程中,我注意到WebApplicationFactory中出现了突破性的变化。复制: 在集成测试的基本库中,我使用了WebApplicationFactory来设置服务器和配置服务。例如,设想以下服务 公共接口IHelloService { 字符串Say(); } 公共类HelloService:IHelloService { 公共字符串Say()=>“来自原始服务的您好”; } 公共类CustomHelloService:IHelloService {

在从.NET Core 2迁移到3的过程中,我注意到
WebApplicationFactory
中出现了突破性的变化。复制:

在集成测试的基本库中,我使用了
WebApplicationFactory
来设置服务器和配置服务。例如,设想以下服务


公共接口IHelloService
{
字符串Say();
}
公共类HelloService:IHelloService
{
公共字符串Say()=>“来自原始服务的您好”;
}
公共类CustomHelloService:IHelloService
{
公共字符串Say()=>“来自自定义服务的您好”;
}
公营创业
{
public void配置服务(IServiceCollection服务)
{
services.TryAddSingleton();
}
public void配置(IApplicationBuilder应用程序、IWebHostEnvironment环境)
{
}
}
集成测试和夹具的基类如下所示

公共类TestFixture:IntegrationTests
{
[事实]
公共无效SayHallo()
{
var service=Services.GetService();
Assert.Equal(“来自定制服务的Hello”,service.Say());
}
受保护的覆盖无效配置服务(IServiceCollection服务)
{
services.TryAddSingleton();
}
}
公共抽象类集成测试:IDisposable,其中TStartup:class
{
私有只读WebApplicationFactory\u工厂;
受保护的IntegrationTests():此(typeof(TStartup).Assembly.GetName().Name)
{
}
受保护的集成测试(字符串projectRelativePath)
{
_factory=新的WebApplicationFactory()。WithWebHostBuilder(b=>
{
B
.UseSolutionRelativeContentRoot(Path.Combine(“src”,projectRelativePath))
.配置服务(配置服务);
});
_CreateClient();
服务=工厂服务;
}
受保护的IServiceProvider服务{get;}
受保护的虚拟void配置服务(IServiceCollection服务)
{
}
公共空间处置()
{
_工厂处理();
}
}
.NET Core 2.1
Microsoft.AspNetCore.Mvc.Testing 2.1.3
方法
TestFixture.ConfigureServices()
在启动之前调用。ConfigureServices和测试通过

.NET Core 3.1
Microsoft.AspNetCore.Mvc.Testing 3.1.1
方法
TestFixture.ConfigureServices()
启动后调用。ConfigureServices和测试失败

你知道这种改变是不是有意的吗?在.NET Core 2.1中,首先调用了来自测试的ConfigureServices,
TryAddSingleton
正在注册我的模拟服务。稍后,
Startup.ConfigureServices
跳过了注册,因为服务已添加


在.NET Core 3.1中,我不得不调用
AddSingleton
,它将取代该服务。这是一个bug还是一个想要的改变?我能以某种方式克服它吗?

对于其他人来说,它是被设计改变的