您好,我正在尝试实现一个将日志输入文件的记录器。文件的路径存储在我的 appSettings.json 中。通过模型类,我引用了我的 appSettings.json。这是 LogWriter.cs
public class LogWriter
{
public void WriteLog(string message, IOptions<AppSettings> appSettings)
{
AppSettings _appSettings = appSettings.Value;
using (StreamWriter writer = new StreamWriter(_appSettings.LogFilePath))
{
writer.Write("[" + DateTime.Now.ToString("MM/dd/yyyy HH:mm:ss") +"] " + message);
}
}
}
我想通过 WriteLog 方法注入 appSettings 依赖项,以便我可以调用该方法而无需创建 LogWriter 类的实例。为了创建依赖关系,我向您展示了我的程序.cs
var builder = WebApplication.CreateBuilder(args);
builder.Configuration
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
var appSettings = new AppSettings();
builder.Configuration.GetSection("AppSettings").Bind(appSettings);
//Add services to the container.
builder.Services.Configure<AppSettings>(builder.Configuration.GetSection("AppSettings"));
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddScoped<IMessageService, MessageService>();
builder.Services.AddScoped<LogWriter>();// DI for LogWriter
builder.Services.AddDbContext<MailContext>(
o => o.UseNpgsql(appSettings.ConnectionStrings.MailDb)
);
var app = builder.Build();
app.UseSwagger();
app.UseSwaggerUI();
app.UseAuthorization();
app.MapControllers();
app.Run();
当我使用
LogWriter.WriteLog("Text for testing")
调用该方法时,我收到一个错误,指出缺少一个参数。例如在我的控制器中。
[Route("[controller]")]
[ApiController]
public class MessageController : ControllerBase
{
private readonly IMessageService _mailService;
public MessageController(IMessageService mailServiceCustom )
{
_mailService = mailServiceCustom;
LogWriter.WriteLog("Construktor wird ausgeführt");
}
...
您编写的代码需要
WriteLog
方法是静态的,这可能不是您想要的。
在 .NET 中管理 DI 的常用方法是通过构造函数注入,通常通过接口来区分“正在做什么”和“如何完成”。
最简单的修复方法是让您的 LogWriter
类在其构造函数中采用
IOptions<AppSettings> appSettings
作为参数,而不是其
WriteLog
方法,并将其存储在 private readonly
变量中,然后让您的 MessageController
类采用its构造函数中的
LogWriter
。也就是说,正如评论中提到的,有众所周知的 ILogger
和 ILogger<T>
接口以及实现这些接口的众多日志记录解决方案,因此您可能最好不要重新发明轮子