如何在不关闭appdomain的情况下重新加载NLog类型实例?

时间:2017-06-28 22:34:41

标签: nlog xunit createinstance

NLog提供了一个工厂,用于指定如何创建设置NLog时使用的不同类实例,例如目标和渲染器。

ConfigurationItemFactory.Default.CreateInstance

我有一堆单元测试(XUnit)依赖于能够配置此功能以使用我的自定义日志记录功能测试不同的行为。但是,在启动appdomain后请求第一个记录器时,此功能仅运行一次。这会导致在同一appdomain中运行的所有其他测试出现问题,因为NLog框架在重新启动appdomain之前不会再次执行CreteInstance,例如,在运行Visual Studio XUnit运行程序时不会这样做。

如何强制NLog重新创建用CreteInstance指定的不同类型?

2 个答案:

答案 0 :(得分:0)

将默认值设置为null,然后下次创建新默认值。

ConfigurationItemFactory.Default = null;

答案 1 :(得分:0)

感谢您的回复。但是,我不想重置为默认值,我希望能够在测试之间更改配置。

设置ConfigurationItemFactory.Default.CreateInstance然后执行LogManager.Configuration = LogManager.Configuration.Reload();并在测试执行后重置工厂(通过将默认工厂设置为null,如您所说),或者设置{{ 1}}回到之前的技巧。

我必须说我不喜欢实施。令人困惑的是如何重置NLog。你会认为CreteInstance可以做到这一点,但不是。 另外,我认为LogManager.Shutdown();的目的是提供自定义依赖项解析。但由于每种类型只运行一次,因此完全忽略了任何范围。它应该是ConfigurationItemFactory的实施,通过使用IOC容器来决定在需要解决时要做什么。