Unity容器工厂依赖外部数据



我正在编写一个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());
}

最新更新