代码之家  ›  专栏  ›  技术社区  ›  void.pointer

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

  •  0
  • void.pointer  · 技术社区  · 3 年前

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

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

    public static void Setup(IUnityContainer container)
    {
        container.RegisterFactory<ILogger>(_ => new LoggerConfiguration()
            .WriteTo.Console()
            .CreateLogger(),
            new SingletonLifetimeManager());
    }
    

    然而,我有一个命令行参数, --debug ,这将显示调试级日志。如果未指定此选项,则应保持默认信息级别。从Serilog示例中,他们设置调试级别的方式是通过向 LoggerConfiguration 对象(即。 MinimumLevel.Debug()

    之后 我定义了合成根。

    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();
        }
    }
    
    0 回复  |  直到 3 年前
        1
  •  1
  •   Steven    3 年前

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

    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());
    }