提问人:Razielruss 提问时间:10/23/2023 更新时间:10/23/2023 访问量:61
如何在 C# .Net 中设置方法依赖关系注入
how to set a method dependency injection in c# .Net
问:
您好,我正在尝试实现一个将日志输入到文件中的记录器。文件的路径存储在我的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");
}
...
答:
1赞
ste-fu
10/23/2023
#1
您编写的代码将要求方法是静态的,这可能不是您想要的。WriteLog
在 .NET 中管理 DI 的常用方法是通过构造函数注入,通常是通过接口将正在执行的操作与正在执行的操作分开。
最简单的解决方法是,你的类在其构造函数中将 an 作为参数,而不是它的方法,并将其存储在变量中,然后让你的类在其构造函数中获取 a。LogWriter
IOptions<AppSettings> appSettings
WriteLog
private readonly
MessageController
LogWriter
也就是说,正如评论中提到的,有众所周知的接口以及实现这些接口的众多日志记录解决方案,因此您最好不要重新发明轮子ILogger
ILogger<T>
下一个:数值方法与算法方法
评论