在 .net core 2 中,我创建了一个带有自定义属性的托管服务,例如:
public class MyService : BackgroundService
{
public bool IsRunning {get;set;}
...
我可以在startup.cs中进行设置,例如:
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IHostedService,HostedServices.MyService>();
...
然后我可以在Razor页面的其他位置引用它,例如:
public class IndexModel : PageModel
{
private readonly IHostedService _mySrv;
public IndexModel(IHostedService mySrv) => _mySrv = mySrv;
[BindProperty]
public bool IsRunning { get; set; }
public void OnGet() => IsRunning = ((HostedServices.MyService)_mySrv).IsRunning;
}
现在我已经升级到 .net core 3,我的启动项已经改变为:
services.AddHostedService<HostedServices.MyService>();
但是,我在IndexModel中使用DI引用时无法获取到我的MyService,它给我返回的是一个类型为GenericWebHostService的对象,而我无法找到如何从中获取我的自定义MyService。在IndexModel中将“IHostedService”更改为“MyService”也不起作用,会出现“无法解析服务”的错误。
我该如何从依赖注入中获取MyService的实例?
StartAsync
和StopAsync
。此外,这个答案 似乎与您的说法相矛盾。 - JoeliusIHostedService
接口后面进行了注册,它就可以正常工作。这实际上是AddHostedService
所做的全部。我会找到一个源代码链接来证明它... - Kirk LarkinHost
只是请求IEnumerable<IHostedService>
并在它们上调用StartAsync
。你提供的答案只是说AddSingleton
而没有指定接口不起作用,这是正确的。我并没有说任何不同。正是我展示的第二个注册将它们联系在一起。 - Kirk Larkin