2014-06-30 44 views
1

我正在使用內置支持castle的NLog,並試圖找到一種方法在運行時更改連接字符串。城堡和NLog在運行時更改連接字符串

這是我最近的搖擺和錯過,我確定它必須在這一點上完成生命週期,因爲所有的配置都是空的,所以我猜測城堡還沒有連接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我知道我可以在運行時配置這個,但我更喜歡讓大部分設置來自配置文件,然後只是覆蓋連接字符串。

+0

張貼了一個解決方案,但沒有標記爲答案,因爲我很好奇別人可能會想出什麼 – workabyte

回答

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; 
     } 
    } 
} 

仍不能確定這是最好的解決方案,但它現在的作品,很想看到其他解決方案,如果任何人有一個