如何在不关闭AppDomain的情况下重新加载NLOG类型实例



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

ConfigurationItemFactory.Default.CreateInstance

我有一堆单元测试(XUNIT(,它们依靠能够配置此功能以使用我的自定义记录功能来测试不同的行为。但是,在启动AppDomain后请求第一个记录器时,此功能仅运行一次。这会导致在同一AppDomain中运行的所有其他测试的问题,因为NLOG框架将在AppDomain重新启动之前不会再次执行CreteInstance,例如运行Visual Studio Xunit Runner时不会。

。 。

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

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

ConfigurationItemFactory.Default = null;

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

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

我必须说我不喜欢实施。它使如何重置NLOG感到困惑。您可能会认为LogManager.Shutdown();可以解决问题,但没有。另外,我认为ConfigurationItemFactory的重点是提供自定义的依赖性解决方案。但是,由于每种类型仅运行一次,因此它完全忽略了任何范围。CreteInstance应该是通过使用IOC容器来决定解决方案时该做什么的隐含。