C# 以正确的方式实现ILogger接口
给定几种类型的类构造函数注入,即:C# 以正确的方式实现ILogger接口,c#,logging,dependency-injection,architecture,C#,Logging,Dependency Injection,Architecture,给定几种类型的类构造函数注入,即: public class DataService :IDataService { public DataService(ILogger logger) { ... } } 以及 或者,我应该这样做 public class DataService : IDataService, ILogger, IDisposable { public DataService() { ... } } 然而,我实际上不喜欢在每个存储库类或其他同时需要数据服务
public class DataService :IDataService
{
public DataService(ILogger logger) { ... }
}
以及
或者,我应该这样做
public class DataService : IDataService, ILogger, IDisposable
{
public DataService() { ... }
}
然而,我实际上不喜欢在每个存储库类或其他同时需要数据服务和日志记录的类上这样做
public class SomeRepository : IRepostiory
{
public SomeRepository (IDataService service, ILogger logger) { ... }
}
我对这个模型很满意
public interface IRepository : ILogger { ... }
或者
哪一个是首选的最佳实践设计?此外,我们如何确定是否要记录数据服务过程,同时还要记录注入ILogger服务或使用存储库的其他组件?这是一个开玩笑的回答,但没有“正确”的方法来实现ILogger。您可能应该使用现有的框架来构建一个
ILogger
,或者将其交给NLog、log4net或Serilog。除非您计划构建自己的日志框架,否则不应该直接实现ILogger
。您应该使用日志库的扩展方法连接ILogger
,下面是一个关于这方面的示例
下面是如何启动和运行控制台的一个简单示例:
var hostBuilder = Host.CreateDefaultBuilder().
ConfigureLogging((builderContext, loggingBuilder) =>
{
loggingBuilder.AddConsole((options) =>
{
//This displays arguments from the scope
options.IncludeScopes = true;
});
});
var host = hostBuilder.Build();
var logger = host.Services.GetRequiredService<ILogger<LogTest>>();
//This specifies that every time a log message is logged, the correlation id will be logged as part of it
using (logger.BeginScope("Correlation ID: {correlationID}", 123))
{
logger.LogInformation("Test");
logger.LogInformation("Test2");
}
var hostBuilder=Host.CreateDefaultBuilder()。
配置日志((builderContext,loggingBuilder)=>
{
loggingBuilder.AddConsole((选项)=>
{
//这将显示范围中的参数
options.IncludeScopes=true;
});
});
var host=hostBuilder.Build();
var logger=host.Services.GetRequiredService();
//这指定每次记录日志消息时,相关id都将作为日志的一部分进行记录
使用(logger.BeginScope(“相关ID:{correlationID}”,123))
{
logger.登录信息(“测试”);
logger.LogInformation(“Test2”);
}
这是一个开玩笑的回答,但没有“正确”的方法来实现ILogger。您可能应该使用现有的框架来构建一个ILogger
,或者将其交给NLog、log4net或Serilog。除非您计划构建自己的日志框架,否则不应该直接实现ILogger
。您应该使用日志库的扩展方法连接ILogger
,下面是一个关于这方面的示例
下面是如何启动和运行控制台的一个简单示例:
var hostBuilder = Host.CreateDefaultBuilder().
ConfigureLogging((builderContext, loggingBuilder) =>
{
loggingBuilder.AddConsole((options) =>
{
//This displays arguments from the scope
options.IncludeScopes = true;
});
});
var host = hostBuilder.Build();
var logger = host.Services.GetRequiredService<ILogger<LogTest>>();
//This specifies that every time a log message is logged, the correlation id will be logged as part of it
using (logger.BeginScope("Correlation ID: {correlationID}", 123))
{
logger.LogInformation("Test");
logger.LogInformation("Test2");
}
var hostBuilder=Host.CreateDefaultBuilder()。
配置日志((builderContext,loggingBuilder)=>
{
loggingBuilder.AddConsole((选项)=>
{
//这将显示范围中的参数
options.IncludeScopes=true;
});
});
var host=hostBuilder.Build();
var logger=host.Services.GetRequiredService();
//这指定每次记录日志消息时,相关id都将作为日志的一部分进行记录
使用(logger.BeginScope(“相关ID:{correlationID}”,123))
{
logger.登录信息(“测试”);
logger.LogInformation(“Test2”);
}
为什么您的记录器需要idataservice?只要问一下就行了,因为这是循环引用。。讨厌(另外,我假设记录器实现ilogger,可能是错误的!您能否详细说明数据服务
的用途,我感觉您选择了低效的设计。通常,您将注入到构造函数或需要注入的任何内容的方法中。@ChrisWatts,啊,好的。我需要数据服务将日志保存到数据库中。No、 它不是循环引用,问题是选择哪一种更好。项目中只有一种类型。我知道我可以在数据库的记录器中直接执行此操作,这就是为什么我想知道如何执行此操作。@OrelEraki,当然,我需要存储库的数据服务。数据服务可以是任何存储连接器。Probably这里的命名不合适。无论如何,问题的背景是,如果我也想在数据服务中记录一些内容,那么哪个更好,以及如何使用数据库实现日志记录。为什么您的日志记录程序需要idataservice?请提问,因为这是一个循环引用..讨厌!:(另外,我假设记录器实现ilogger,可能是错误的!您能否详细说明数据服务
的用途,我感觉您选择了低效的设计。通常,您将注入到构造函数或需要注入的任何内容的方法中。@ChrisWatts,啊,好的。我需要数据服务将日志保存到数据库中。No、 它不是循环引用,问题是选择哪一种更好。项目中只有一种类型。我知道我可以在数据库的记录器中直接执行此操作,这就是为什么我想知道如何执行此操作。@OrelEraki,当然,我需要存储库的数据服务。数据服务可以是任何存储连接器。Probabl无论如何,问题的背景是,如果我也想在数据服务中记录一些东西,那么哪个更好,以及如何使用数据库实现日志记录。
var hostBuilder = Host.CreateDefaultBuilder().
ConfigureLogging((builderContext, loggingBuilder) =>
{
loggingBuilder.AddConsole((options) =>
{
//This displays arguments from the scope
options.IncludeScopes = true;
});
});
var host = hostBuilder.Build();
var logger = host.Services.GetRequiredService<ILogger<LogTest>>();
//This specifies that every time a log message is logged, the correlation id will be logged as part of it
using (logger.BeginScope("Correlation ID: {correlationID}", 123))
{
logger.LogInformation("Test");
logger.LogInformation("Test2");
}