首页 > 解决方案 > ASP.NET Core 服务范围工厂未定义行为

问题描述

在后台服务中获取服务实例时,我观察到一些特殊行为。

我有一个服务,该服务是在其中一个属性具有默认值的情况下构建的。对于此服务的前两个实例,它拥有预期的默认值。在第三次实例化时,它始终具有未定义的值。

public class MyWorker : BackgroundService
{
    private readonly IServiceScopeFactory _scopeFactory;
        
    public MyWorker(IServiceScopeFactory scopeFactory)
    {
        _scopeFactory = scopeFactory;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        for (int i = 0; i < 3; i++)
        {
            using (var scope = _scopeFactory.CreateScope())
            {
                var myService = scope.ServiceProvider.GetRequiredService<MyService>();
                ...
            }

            await Task.Delay(100, stoppingToken);
        }
    }
}
public class MyService
{
    private readonly MyEnum _myEnum;

    public MyService(MyEnum myEnum = MyEnum.ValueA)
    {
        _myEnum = myEnum;
        Console.WriteLine("Value: {0}", myEnum);
    }
}
public class Startup {
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddTransient<MyService>();
        services.AddHostedService<MyWorker>();
    }
}

输出:

Value: ValueA
Value: ValueA
Value: -1140239512

如果我MyService按如下方式添加到容器中,并显式实例化MyService,问题就会消失:

public class Startup {
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddTransient<MyService>(new MyService());
        services.AddHostedService<MyWorker>();
    }
}

有谁知道可能导致这种行为的原因?

标签: c#asp.netasp.net-coreasp.net-core-mvc

解决方案


这似乎是 ASP.NET Core 3.x 中存在的错误。

该问题已在 .NET 5.x 中得到解决。

有关更多信息,请参阅此错误报告https://github.com/dotnet/extensions/issues/2431

对于那些感兴趣的人,描述为什么它在第三次调用时总是中断:https ://github.com/dotnet/runtime/issues/42037#issuecomment-691221525


推荐阅读