[英]Dependency Injection Error in Worker Service
无法构造某些服务(验证服务描述符“ServiceType:Microsoft.Extensions.Hosting.IHostedService Lifetime:Singleton ImplementationType:ProjectName.WS.Worker”时出错:无法从单例中使用作用域服务“ProjectName.Service.IServiceManager” 'Microsoft.Extensions.Hosting.IHostedService'。)
Program.cs 代码
IHost host = Host.CreateDefaultBuilder(args)
.UseWindowsService(options =>
{
options.ServiceName = "Service Name";
})
.ConfigureLogging(logging =>
{
logging.AddSerilog();
})
.ConfigureServices((builder, services) =>
{
services.AddHostedService<Worker>();
services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))
);
services.AddIdentity<IdentityUser, IdentityRole>().AddDefaultTokenProviders()
.AddEntityFrameworkStores<AppDbContext>();
services.AddScoped<IServiceManager, ServiceManager>();
services.AddScoped<IRepoManager, RepoManager>();
})
.Build();
等待主机.RunAsync();
Worker.cs 文件代码
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
private readonly IServiceManager _serviceManager;
private readonly IRepoManager _repoManager;
public Worker(ILogger<Worker> logger, IServiceManager serviceManager, IRepoManager repoManager)
{
_logger = logger;
_serviceManager = serviceManager;
_repoManager = repoManager;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
var ewr = _serviceManager.CountryService.GetAll();
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await Task.Delay(1000, stoppingToken);
}
}
}
服务管理器文件代码 --
public class ServiceManager : IServiceManager
{
private IRepoManager _repoManager { get; set; }
public ServiceManager(IRepoManager repoManager)
{
_repoManager = repoManager;
CountryService = new CountryService(_repoManager.CountryRepo);
}
public ICountryService CountryService { get; set; }
}
Remo 管理器文件代码 --
public class RepoManager : IRepoManager
{
private AppDbContext _db;
public RepoManager(AppDbContext db)
{
_db = db;
CountryRepo = new CountryRepo(_db);
}
public ICountryRepo CountryRepo { get; private set; }
}
国家服务档案代码——
public class CountryService : ICountryService
{
private readonly ICountryRepo _repo;
public CountryService(ICountryRepo repo)
{
_repo = repo;
}
}
国家回购文件代码 --
public class CountryRepo : ICountryRepo
{
private readonly AppDbContext _db;
public CountryRepo(AppDbContext db)
{
_db = db;
}
}
AppDBContext 文件代码——
public class AppDbContext : IdentityDbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
{
}
public DbSet<Country> Country { get; set; }
}
无法使用构造函数初始化服务,您应该这样做:
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
using (IServiceScope scope = _serviceProvider.CreateScope())
{
var _localServiceManager = scope.ServiceProvider.GetRequiredService<IServiceManager>();
var ewr = _serviceManager.CountryService.GetAll();
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await Task.Delay(1000, stoppingToken);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.