.Net Core 遇到的坑(二)在 ASP.NET Core 中使用托管服务实现后台任务

1、添加扩展包 Microsoft.Extensions.Hosting.Abstractions

2、新建类并继承IHostedService,并实现接口方法

public class MyServerProgram:IHostedService
{
     private readonly IToDoWork _toDoWork ;
     public TcpServerProgram(ILogger logger,IToDoWork toDoWork)
     {
         _logger = logger;
         _toDoWork = toDoWork;
     }
     public Task StartAsync(CancellationToken cancellationToken)
     {
            _logger.LogInformation($"Server is running");
            _toDoWork.DoSomething();
            return Task.CompletedTask;
     }

     public Task StopAsync(CancellationToken cancellationToken)
     {
            _logger.LogInformation($"Server has been stopped");
            return Task.CompletedTask;
     }
}

3、在Startup类中注册服务

services.AddScoped();
services.AddHostedService();

如果不注入IToDoWork 这个依赖,正常运行没问题,但是一但注入之后就会提示:在singleton中使用了scoped不行怎么怎么滴

反正意思就是要注入也必须是singleton的依赖,我改成了services.AddSingleton(),后来发现需要从数据库中读取一下配置,数据库操作用的是Ef core,如果把数据操作的依赖项也改成Singleton,DbContext那里又报错,说DbContext是scoped的,这个可没法改了,难道就没法玩了吗?

后来看教学视频的时候上面在用autofac这个IOC容器,然后就在这个项目上面试着添加了autofac及其依赖包,并在Program中注册了UseServiceProviderFactory(new AutofacServiceProviderFactory()),而其实并没有用autofac具体做什么,F5运行没报错。这样就把上面的问题给解决了,太具体原因不知道,问题应该就出现在UseServiceProviderFactory(new AutofacServiceProviderFactory())这里,使用了acutfac 的provider factory,然后就可以正常运行了。

 

你可能感兴趣的:(netcore)