我正在编写一个C#.NET Core 5.0控制台应用程序。此应用程序使用CommandLineUtils处理命令行参数,使用Unity Container处理DI,使用Serilog处理日志。
我正在我的合成根目录中注册Serilog:
public static void Setup(IUnityContainer container)
{
container.RegisterFactory<ILogger>(_ => new LoggerConfiguration()
.WriteTo.Console()
.CreateLogger(),
new SingletonLifetimeManager());
}
但是,我有一个命令行参数--debug
,它应该显示DEBUG级别的日志。如果未指定此选项,则应保持默认的INFO级别。从Serilog的例子来看,他们设置DEBUG级别的方法是添加对LoggerConfiguration
对象(即MinimumLevel.Debug()
(的调用
但我不知道我是否需要调用它,直到CLI处理完成,这发生在我定义组合根之后。
我好像陷入了困境。我知道在应用程序的根目录之外使用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());
}