我正在编写一个 C# .NET Core 5.0 控制台应用程序。此应用程序使用 CommandLineUtils 处理命令行参数、Unity Container for DI 和 Serilog 进行日志记录。
我正在我的作曲根目录中注册 Serilog:
public static void Setup(IUnityContainer container)
{
container.RegisterFactory<ILogger>(_ => new LoggerConfiguration()
.WriteTo.Console()
.CreateLogger(),
new SingletonLifetimeManager());
}
但是,我有一个命令行参数,
--debug
,它应该显示调试级别日志。如果未指定此选项,则应保持默认的 INFO 级别。从 Serilog 示例来看,他们设置 DEBUG 级别的方式是添加对 LoggerConfiguration
对象的调用(即 MinimumLevel.Debug()
)
但我不知道是否需要在 CLI 处理发生之后调用它,这发生在之后我定义了组合根。
看来我陷入了第22条军规的境地。我知道在应用程序根目录之外使用
RegisterType()
是不好的做法。我应该如何解决这个循环依赖?
编辑
这是我的
Program
类,它显示了事物的顺序:
internal static class Program
{
private static IUnityContainer Container { get; } = new UnityContainer();
private static void Main(string[] args)
{
CompositionRoot.Setup(Container);
var app = new CommandLineApplication<TrashCommand>();
app.Conventions
.UseDefaultConventions()
.UseConstructorInjection(new UnityServiceProvider(Container));
app.Execute(args);
Log.CloseAndFlush();
}
}
也许我误解了你的问题,但是像下面这样的结构不能回答你的问题吗?
public static void Setup(IUnityContainer container, bool logDebug)
{
LogEventLevel level = logDebug ? LogEventLevel.Debug : LogEventLevel.Info.
container.RegisterFactory<ILogger>(_ => new LoggerConfiguration()
.WriteTo.Console()
.MinimumLevel.Is(level)
.CreateLogger(),
new SingletonLifetimeManager());
}
或者,另一种选择:
public static void Setup(IUnityContainer container, bool logDebug)
{
LogEventLevel level = logDebug ? LogEventLevel.Debug : LogEventLevel.Info.
container.RegisterFactory<ILogger>(_ =>
{
var config = new LoggerConfiguration().WriteTo.Console();
if (logDebug) config = config.MinimumLevel.Is(level);
return config.CreateLogger();
},
new SingletonLifetimeManager());
}