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

问题描述 投票:0回答:1

我正在编写一个 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();
    }
}
c# dependency-injection unity-container serilog
1个回答
1
投票

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

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());
}
© www.soinside.com 2019 - 2024. All rights reserved.