C# Castle和NLog在运行时更改连接字符串

C# Castle和NLog在运行时更改连接字符串,c#,castle-windsor,nlog,C#,Castle Windsor,Nlog,我正在使用对castle的NLog内置支持,并试图找到一种在运行时更改连接字符串的方法 这是我最新的swing和miss,我确信它必须在这一点上完成生命周期,因为所有的配置都是空的,所以我猜castle还没有连接NLog的肠子 private const string NLogConnectionString = "NLogConnection"; public void Install(IWindsorContainer container, IConfigurationSt

我正在使用对castle的NLog内置支持,并试图找到一种在运行时更改连接字符串的方法

这是我最新的swing和miss,我确信它必须在这一点上完成生命周期,因为所有的配置都是空的,所以我猜castle还没有连接NLog的肠子

    private const string NLogConnectionString = "NLogConnection";

    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.AddFacility<LoggingFacility>(l => l.UseNLog());

        var config = new NLog.Config.LoggingConfiguration();
        var dbtarget = config.FindTargetByName("database") as DatabaseTarget;

        if (dbtarget != null)
        {
            dbtarget.ConnectionString = MethodThatGiveMeConnectionString(NLogConnectionString);
        }
    }
考虑到这一点,这可能是一种选择,但基于这里的工作方式,我不想改变这一点,更倾向于直接向NLog提供连接字符串


我知道我可以在运行时配置它,但我更喜欢让大多数设置来自配置文件,然后覆盖连接字符串。

因此我找到了一个可行的解决方案,但不确定它是否是最好的方法

用作参考。这一评论最有帮助:

最初,我尝试实现一个定制ILoggerFactory,并通过customLoggerFactory将其注入LoggingFacility。但这很快被证明是一条死胡同。然后我研究了NLog集成,发现已经有一个NLogFactory将其方法标记为虚拟。所以我能从这门课上得到答案

作者正在解决的问题与我自己的不同,但它让我想出了这个解决方案:

public class LoggerInstall : IWindsorInstaller
{
    private const string NLogConnectionString = "NLogConnection";

    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        var config = new NLog.Config.LoggingConfiguration();
        container.AddFacility<LoggingFacility>(l => l.LogUsing(new OwnNLogFactory(GetYourConnectionStringMethod(NLogConnectionString))));
    }
}


public class OwnNLogFactory : NLogFactory  
{
    public OwnNLogFactory(string connectionString)
    {
        foreach (var dbTarget in LogManager.Configuration.AllTargets.OfType<DatabaseTarget>().Select(aTarget => aTarget))
        {
            dbTarget.ConnectionString = connectionString;
        }
    }
}

仍然不确定这是否是最好的解决方案,但它目前仍然有效,如果有人发布了一个解决方案,但尚未将其标记为答案,我希望看到其他解决方案,因为我很好奇其他人可能会想到什么