无法将BackgroundService注入PageModel

时间:2019-01-09 08:20:07

标签: asp.net-core

我正在尝试使用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()
        {

        }
    }
}

1 个答案:

答案 0 :(得分:3)

注册后台服务实际上并没有将其添加到服务集合中,这主要是因为不需要这样做。后台服务的全部要点是您的应用程序实际上不需要了解它。尚不清楚为什么您认为需要注入此服务,但几乎可以肯定的是,将Razor Page中需要的任何逻辑分解为该服务和Razor页面都可以使用的单独类,可以为您提供更好的服务。

更新

请参见documentation on IHostedService where an example of a queue background service is given。您会注意到,实际的托管服务已注入任务队列。然后,您的应用程序还将只注入任务队列本身以安排任务。