c# - 如何解决 .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?
解决方案
我已经能够解决这个问题。解释在此页面上 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>();
});
推荐阅读
- javascript - 如何在完成时阻止javascript计时器重置
- python - 我可以使用上下文值作为 click.option() 默认值吗?
- linux - 在 jupyter 笔记本终端上运行 GUI 应用程序 (DISPLAY) - Linux
- amazon-dynamodb - DynamoDB 邻接列表模式
- sql - SQL IF ELSE 插入#temp 表问题
- python - python - 如何根据与python pandas中前一行的差异来移动列值?
- javascript - 这可以重构为示例中更可组合的样式吗?
- java - org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild:开始:org.apache.catalina.LifecycleException
- c - 如何从 flex 文件中读取规则(定义)?
- algorithm - 最小和大于或等于 k 的子集