我正在尝试使用BackgroundService是一个使用Razor页面项目模板而不是MVC的asp.net core 2.2项目。这个小样本应用程序花了我大约1分钟的时间来编写,所以它再简单不过了。查看调试器,我知道后台服务正在启动并且运行良好。但是,当我尝试导航到需要将此服务作为依赖项的页面(路径“香蕉”)时,我得到InvalidOperationException: Unable to resolve service for type 'WebApplication23.DumbService' while attempting to activate 'WebApplication23.Pages.BananaModel'.
为什么不能从页面模型访问此服务?代码位于https://github.com/jmagaram/SimpleBackgroundService
我提供以下服务:
using Microsoft.Extensions.Hosting;
using System.Threading;
using System.Threading.Tasks;
namespace WebApplication23
{
public class DumbService : BackgroundService
{
public DumbService()
{
}
public void QueueWork()
{
}
protected async override Task ExecuteAsync(CancellationToken cancellationToken)
{
while (!cancellationToken.IsCancellationRequested) {
await Task.Delay(TimeSpan.FromSeconds(1));
}
}
}
}
这是我注册的地方:
services.AddHostedService<DumbService>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
这里是使用它的页面模型:
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace WebApplication23.Pages
{
public class BananaModel : PageModel
{
private readonly DumbService _service;
public BananaModel(DumbService service)
{
_service = service;
}
public void OnGet()
{
}
}
}
答案 0 :(得分:3)
注册后台服务实际上并没有将其添加到服务集合中,这主要是因为不需要这样做。后台服务的全部要点是您的应用程序实际上不需要了解它。尚不清楚为什么您认为需要注入此服务,但几乎可以肯定的是,将Razor Page中需要的任何逻辑分解为该服务和Razor页面都可以使用的单独类,可以为您提供更好的服务。
更新
请参见documentation on IHostedService
where an example of a queue background service is given。您会注意到,实际的托管服务已注入任务队列。然后,您的应用程序还将只注入任务队列本身以安排任务。