工人服务中的依赖注入错误

发布于 2025-02-05 01:59:37 字数 3460 浏览 4 评论 0原文

某些服务无法构建(在验证服务描述符的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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

风苍溪 2025-02-12 01:59:38

无法使用构造函数初始化该服务,您应该这样做:

    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);
            }
        }
    }

这是Microsoft的一个示例

The service can not be initialized using the constructor instead you should do it like this:

    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);
            }
        }
    }

This is an example of microsoft

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文