c# - 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>();
}
}
有谁知道可能导致这种行为的原因?
解决方案
这似乎是 ASP.NET Core 3.x 中存在的错误。
该问题已在 .NET 5.x 中得到解决。
有关更多信息,请参阅此错误报告https://github.com/dotnet/extensions/issues/2431
对于那些感兴趣的人,描述为什么它在第三次调用时总是中断:https ://github.com/dotnet/runtime/issues/42037#issuecomment-691221525
推荐阅读
- android - 必须 onCreateOptionsMenu 成为每个活动的实现吗?
- javascript - Discord.js 在一条消息中发送多个附件
- java - 为什么我的按钮组不起作用和显示?
- javascript - 我如何知道在按钮类中单击了哪个按钮?
- yaml - 试图在 Cygwin 中保存 yml 对象
- mysql - 为链接的一对多关系插入查询
- python - 有两个输入的石头、纸、剪刀游戏
- reactjs - 'docker run ...' 在执行 sh 脚本时挂起
- ios - 获取集合中的文档名称列表 Google Firestore
- java - 更改 JComboBox 的字体颜色