如何在 C# .Net 中设置方法依赖关系注入

how to set a method dependency injection in c# .Net

提问人:Razielruss 提问时间:10/23/2023 更新时间:10/23/2023 访问量:61

问:

您好,我正在尝试实现一个将日志输入到文件中的记录器。文件的路径存储在我的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 方法 依赖注入

评论

0赞 Ralf 10/23/2023
查看现有的 ILogger 接口。您应该从那里开始实施。因此,没有一个具体的 Logger 类,而是一个本身可注射的记录器会更干净。
2赞 Ralf 10/23/2023
顺便说一句,注入的东西在构造函数上工作,而不是在方法上工作。你不能只是把参数留出来,并希望以某种方式注入缺失的参数。
0赞 Razielruss 10/23/2023
这并不完全正确。我读到有 3 种方法可以注入依赖站点。1. 通过构造函数, 2.通过方法和 3.属性注入 linkedin.com/pulse/....
1赞 Ralf 10/23/2023
您显然是在 Asp.Net 中编码一些东西,而对于 DI 框架来说,它是正确的。它执行构造函数注入。属性注入有很多方法,但方法注入需要语言支持,而在标准 c# 中,它根本不存在。
0赞 Nikolay 10/23/2023
日志记录类中没有静态方法

答:

1赞 ste-fu 10/23/2023 #1

您编写的代码将要求方法是静态的,这可能不是您想要的。WriteLog

在 .NET 中管理 DI 的常用方法是通过构造函数注入,通常是通过接口将正在执行操作与正在执行的操作分开

最简单的解决方法是,你的类在其构造函数中将 an 作为参数,而不是它的方法,并将其存储在变量中,然后让你的类在其构造函数中获取 a。LogWriterIOptions<AppSettings> appSettingsWriteLogprivate readonlyMessageControllerLogWriter

也就是说,正如评论中提到的,有众所周知的接口以及实现这些接口的众多日志记录解决方案,因此您最好不要重新发明轮子ILoggerILogger<T>