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

时间:2014-06-30 22:03:17

标签: c# castle-windsor nlog

我正在使用NLog内置的对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);
        }
    }

查看this post它可能是一个选项但是根据事情在这里完成的方式,我不想改变它,而且更喜欢直接向NLog提供连接字符串。

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

1 个答案:

答案 0 :(得分:0)

所以我找到了一个有效的解决方案但不确定它是最好的方法。

使用this post作为参考。这条评论最有帮助:

  

最初,我尝试实现自定义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;
        }
    }
}

仍然不确定这是最好的解决方案,但它现在有效,如果有人有其他解决方案,我很乐意看到其他解决方案