工人服务中的依赖注入错误
某些服务无法构建(在验证服务描述符的ServiceType时出错: Microsoft.extensions.hosting.ihostedservice lifetime:Singleton ImparinationType:ProjectName.ws.w.worker': 无法消费Singleton的Scoped Service'ProjectName.Service.ServiceManager' 'microsoft.extensions.hosting.ihostedservice'。)
program.cs code
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();
等待host host.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; }
}
Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType:
Microsoft.Extensions.Hosting.IHostedService Lifetime: Singleton ImplementationType: ProjectName.WS.Worker':
Cannot consume scoped service 'ProjectName.Service.IServiceManager' from singleton
'Microsoft.Extensions.Hosting.IHostedService'.)
Program.cs Code
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();
await host.RunAsync();
Worker.cs file Code
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);
}
}
}
Service Manager File Code --
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 Manager File Code --
public class RepoManager : IRepoManager
{
private AppDbContext _db;
public RepoManager(AppDbContext db)
{
_db = db;
CountryRepo = new CountryRepo(_db);
}
public ICountryRepo CountryRepo { get; private set; }
}
Country Service File Code --
public class CountryService : ICountryService
{
private readonly ICountryRepo _repo;
public CountryService(ICountryRepo repo)
{
_repo = repo;
}
}
Country Repo File Code --
public class CountryRepo : ICountryRepo
{
private readonly AppDbContext _db;
public CountryRepo(AppDbContext db)
{
_db = db;
}
}
AppDBContext file code --
public class AppDbContext : IdentityDbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
{
}
public DbSet<Country> Country { get; set; }
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
无法使用构造函数初始化该服务,您应该这样做:
这是Microsoft的一个示例
The service can not be initialized using the constructor instead you should do it like this:
This is an example of microsoft