【发布时间】:2020-03-13 16:25:40
【问题描述】:
我正在做一个使用 Serilog 的 Windows 服务
这对工人来说很好:
public class Worker: BackgroundService
{
private readonly ILogger<Worker> _logger;
private readonly IConfiguration _configuration;
private readonly string _connectionString;
private bool _serviceIsStarting = true;
public Worker(ILogger<Worker> logger, IConfiguration iConfig)
{
_logger = logger;
_configuration = iConfig;
_connectionString = _configuration.GetConnectionString("DestinationDatabase");
}
//....
}
我的 Program.cs 包含以下内容:
public static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.UseWindowsService()
.UseSerilog((hostingContext, loggerConfiguration) => loggerConfiguration
.ReadFrom.Configuration(hostingContext.Configuration))
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
});
}
一切都很好,但是我想向我的自定义类注入一个 Worker 实例使用的记录器:
public class DataAccess
{
private readonly string _connectionString;
private readonly ILogger<DataAccess> _logger;
public DataAccess(ILogger<DataAccess> logger, string connectionString)
{
_connectionString = connectionString;
_logger = logger;
}
//.....
}
我的问题是我不知道如何在 worker 中实例化我的类 DataAccess 或到这里的依赖注入。
这是我班级的[简化]版本:
using Microsoft.Extensions.Logging;
using Dapper;
public class DataAccess
{
private readonly string _connectionString;
private readonly ILogger<DataAccess> _logger;
public DataAccess(ILogger<DataAccess> logger, string connectionString)
{
_logger = logger;
_connectionString = connectionString;
}
public void SaveInspection(InspectionElm inspection)
{
using IDbConnection connection = new System.Data.SqlClient.SqlConnection(_connectionString);
connection.Open();
var p = new DynamicParameters();
p.Add("@RodNumber", inspection.RodNumber);
p.Add("@InspectionDate", Convert.ToDateTime(inspection.InspectionDate));
p.Add("@MeasurementEnd", Convert.ToDateTime(inspection.MeasurementEnd));
p.Add("@InspectionResultPass", Convert.ToBoolean(inspection.InspectionResultPass));;
connection.Execute("InsertTindasjaMasterRecord", p, commandType: CommandType.StoredProcedure);
_logger.LogInformation("Log something...");
}
public void InitMesureResultTypes()
{
using IDbConnection connection = new System.Data.SqlClient.SqlConnection(_connectionString);
connection.Open();
connection.Execute("InitMeasureResultType", null, commandType: CommandType.StoredProcedure);
_logger.LogInformation("Log something...");
}
}
【问题讨论】:
-
您应该使用依赖注入容器注册 DataAccess。您可以在
ConfigureServices中添加services.Add<DataAccess>() -
明智的设计 如何使用数据访问?您可以注册数据访问权限并将其注入到需要的位置,但您没有提供足够的信息以供更好地为您提供建议。
标签: c# .net-core dependency-injection windows-services