首页 > 解决方案 > 如何解决 .Net 3 Worker 服务中的依赖注入和不一致的可访问性参数类型“”?

问题描述

我正在设置一个 .Net 核心工作者服务,该服务将从数据库中获取一些数据并将其传递给端点。所以我试图根据我的 .net MVC 知识来设置它。在设置时,我收到了这个错误

未处理的异常。System.ArgumentNullException:值不能为空。(参数“implementationInstance”)在 Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton[TService](IServiceCollection 服务,TService implementationInstance

我创建了一个类,用于从存储过程中获取数据的逻辑。这是商务电话

namespace AgencyBankingSettlement.Business
{
    public class ServiceTask
    {
        private readonly AgencyBankingSettlementDbContext context;

        public ServiceTask(AgencyBankingSettlementDbContext _context)
        {
            context = _context;
        }
        public IEnumerable<Testing> Request() {
            var person = context.Testings.FromSqlRaw<Testing>("dbo.spPerson_GetAll");
            return person;
        }
    }
}

这是我的program.cs。在 program.cs 文件中,我设置了依赖注入,以便我可以轻松地注入我的类和你它。

        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureServices((hostContext, services) =>
                {
                    IConfiguration configuration = hostContext.Configuration;

                    AppSettings appSettings = configuration.GetSection("ContextCore").Get<AppSettings>();

                    services.AddSingleton(appSettings);
                    services.AddScoped<ServiceTask>();

                    services.AddDbContext<AgencyBankingSettlementDbContext>(options =>
                    options.UseSqlServer(hostContext.Configuration.GetConnectionString("DefaultConnection")));

                    services.AddHostedService<Worker>();
                });
    }

所以在我的worker.cs中。我希望能够访问 ServiceTask 文件并记录将从 serviceTask 注入的“人员”信息。我也无法访问该文件。如果我能解决这个问题,那么我想做的所有其他事情也将遵循相同的模式。

    public class Worker : BackgroundService
    {
        private readonly ServiceTask serviceTask;
        private readonly ILogger<Worker> _logger;
        

        public Worker(ILogger<Worker> logger, ServiceTask _serviceTask)
        {
            serviceTask = _serviceTask;
            _logger = logger;
          
        }

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                var persons = serviceTask.Request();
                    _logger.LogInformation(persons);
                _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
                await Task.Delay(1000, stoppingToken);
            }
        }
    }

How can I make this to work?

标签: c#asp.net-coredependency-injectionwindows-servicesbackgroundworker

解决方案


我已经能够解决这个问题。解释在此页面上 ASP.NET Core Worker Service 中的依赖注入

public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureServices((hostContext, services) =>
                {
                    IConfiguration configuration = hostContext.Configuration;

                    AppSettings appSettings = configuration.GetSection("DefaultConnection").Get<AppSettings>();

                    //services.AddTransient(appSettings);
                   //services.AddTransient<ServiceTask>();
                    services.AddSingleton<ServiceTask>();

                    services.AddDbContext<AgencyBankingSettlementDbContext>(options =>
                    options.UseSqlServer(hostContext.Configuration.GetConnectionString("DefaultConnection")), ServiceLifetime.Singleton);

                    services.AddHostedService<Worker>();
                });


推荐阅读