C# 依赖于外部数据的Unity容器工厂

C# 依赖于外部数据的Unity容器工厂,c#,dependency-injection,unity-container,serilog,commandlineutils,C#,Dependency Injection,Unity Container,Serilog,Commandlineutils,我正在编写一个C#.NET Core 5.0控制台应用程序。此应用程序使用CommandLineUtils处理命令行参数,使用Unity容器处理DI,使用Serilog处理日志 我正在我的作文根目录中注册Serilog: publicstaticvoid设置(IUnityContainer容器) { container.RegisterFactory(=>newloggerconfiguration() .WriteTo.Console() .CreateLogger(), 新的Singleto

我正在编写一个C#.NET Core 5.0控制台应用程序。此应用程序使用CommandLineUtils处理命令行参数,使用Unity容器处理DI,使用Serilog处理日志

我正在我的作文根目录中注册Serilog:

publicstaticvoid设置(IUnityContainer容器)
{
container.RegisterFactory(=>newloggerconfiguration()
.WriteTo.Console()
.CreateLogger(),
新的SingletonLifetimeManager());
}
但是,我有一个命令行参数,
--debug
,它应该显示调试级别日志。如果未指定此选项,则应保持默认信息级别。从Serilog示例中,他们设置调试级别的方式是通过添加对
LoggerConfiguration
对象的调用(即
MinimumLevel.DEBUG()

但我不知道是否需要在CLI处理完成之前调用它,这是在我定义合成根之后发生的

看来我陷入了第22条困境。我知道在应用程序的根目录之外
RegisterType()
是不好的做法。我应该如何解决这个循环依赖关系

编辑

下面是我的
程序
类,它显示了事物的顺序:

内部静态类程序
{
私有静态IUnityContainer容器{get;}=new UnityContainer();
私有静态void Main(字符串[]args)
{
CompositionRoot.Setup(容器);
var app=new CommandLineApplication();
应用程序.约定
.UseDefaultConventions()
.UseConstructorInjection(新UnityServiceProvider(容器));
app.Execute(args);
Log.CloseAndFlush();
}
}

也许我误解了你的问题,但下面这样的结构难道不能回答你的问题吗

publicstaticvoid设置(IUnityContainer容器,bool-logDebug)
{
LogEventLevel=logDebug?LogEventLevel.Debug:LogEventLevel.Info。
container.RegisterFactory(=>newloggerconfiguration()
.WriteTo.Console()
.MinimumLevel.Is(标高)
.CreateLogger(),
新的SingletonLifetimeManager());
}
或者,或者:

publicstaticvoid设置(IUnityContainer容器,bool-logDebug)
{
LogEventLevel=logDebug?LogEventLevel.Debug:LogEventLevel.Info。
container.RegisterFactory(\u=>
{
var config=new LoggerConfiguration().WriteTo.Console();
如果(logDebug)config=config.MinimumLevel.Is(level);
返回config.CreateLogger();
},
新的SingletonLifetimeManager());
}

您缺少的部分是
logDebug
的来源。打电话的人从哪里得到的?我的应用程序的第一步是设置DI容器。然后我解析命令行参数。CLI参数
--debug
控制
logDebug
参数是否为true或false。我的CLI解析器依赖于多个服务,因此需要在调用DI容器之前对其进行设置。我用一个示例修改了我的问题,希望能让事情变得更清楚。@void.pointer ahh。。。我明白你的意思。CommandLineUtils仅在您配置容器之后才解析参数。这似乎是CommandLineUtils特有的问题。我不确定natemcmaster是否会关注有关CommandLineUtils的问题,但如果不是这样,最好继续提问。顺便说一句,我对学习答案很感兴趣。如果您有问题的答案,请ping我。@void.pointer您不能检查
args
以获得所需的参数,然后调用上面提供的解决方案吗?@Nkosi,虽然可能,但它破坏了CLU的全部用途,CLU包含复杂的命令行参数解析逻辑。