【发布时间】:2021-03-05 12:45:36
【问题描述】:
在后台服务中获取服务实例时,我观察到一些特殊行为。
我有一个服务,该服务是在其中一个属性具有默认值的情况下构建的。对于此服务的前两个实例,它拥有预期的默认值。在第三次实例化时,它始终具有未定义的值。
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>();
}
}
有人知道是什么原因导致了这种行为吗?
【问题讨论】:
-
您使用的是哪个版本的 ASP Core?
-
我们使用的是 ASP.NET Core 3.1.1
标签: c# asp.net asp.net-core asp.net-core-mvc