如何在c#.Net中设置方法依赖注入

问题描述 投票:0回答:1

您好,我正在尝试实现一个将日志输入文件的记录器。文件的路径存储在我的 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");

        }
...
c# .net methods dependency-injection
1个回答
0
投票

您编写的代码需要

WriteLog
方法是静态的,这可能不是您想要的。

在 .NET 中管理 DI 的常用方法是通过构造函数注入,通常通过接口来区分“正在做什么”和“如何完成”。 最简单的修复方法是让您的 LogWriter 类在其构造函数中采用

IOptions<AppSettings> appSettings

作为参数,而不是其

WriteLog
方法,并将其存储在
private readonly
变量中,然后让您的
MessageController
类采用
its
构造函数中的
LogWriter
也就是说,正如评论中提到的,有众所周知的 ILogger

ILogger<T>

接口以及实现这些接口的众多日志记录解决方案,因此您可能最好不要重新发明轮子

    

© www.soinside.com 2019 - 2024. All rights reserved.