2013-05-22 37 views
2

使用SimpleInjector我在配置結束時調用container.Verify(),並在調試器中獲取診斷信息,如the documentation中所述。我想將這些信息寫入日誌文件。有沒有辦法以編程方式訪問它或以某種方式將記錄器或跟蹤器掛接到SimpleInjector?我可以將SimpleInjectors診斷的結果寫入日誌文件嗎?

+0

你爲什麼要這麼做?當需要分析生產環境中發生的情況時,寫入日誌文件似乎很有用,但開箱和生產服務器上的DI配置之間的區別應該幾乎沒有區別,因此診斷結果將相同在你的機器和服務器上。 – Steven

+0

我們目前正在開放診斷API。這可能會在下一個次要版本(v2.4)中添加。 – Steven

+0

聽起來不錯:-) –

回答

2

簡單注入器2.4包含一個diagnostic API(SimpleInjector.Diagnostics.dll),允許您查詢容器以獲取診斷警告。使用這個API,您可以編寫集成測試,可以自動檢查配置診斷警告:

// using SimpleInjector.Diagnostics; 

[TestMethod] 
public void Container_Always_ContainsNoDiagnosticWarnings() 
{ 
    // Arrange 
    var container = Bootstrapper.GetInitializedContainer(); 

    container.Verify(); 

    // Assert 
    var results = Analyzer.Analyze(container); 

    Assert.IsFalse(results.Any(), Environment.NewLine + 
     string.Join(Environment.NewLine, 
      from result in results 
      select result.Description)); 
} 

當然,你也可以寫一個文件:

var results = Analyzer.Analyze(container); 

File.WriteAllLines("c:\\diagnostic.txt", results.Select(r => r.Description)); 
+1

謝謝,這似乎是做我需要的。順便說一句,如果你有興趣在沒有訴諸反思的情況下暴露我可以刺穿它並給你一個公關。 –

+0

感謝您的提議,但系統的這一部分是內部的原因。除非我確定API是正確的,否則我不想公開事物。例如,這個特性將來可能會有自己的彙編,並且會有所改變。這就是爲什麼它現在不開放。如果這對您不方便,我很抱歉。 – Steven

+0

沒問題。我可以欣賞這一點。 –

2

ContainerDebugView我猜可以歸類爲SimpleInjector中診斷機制的Facade類,它只用作Container類的DebuggerTypeProxy。

這是一個帶有公共構造函數的內部類,所以如果不使用反射和Activator類就不能構造它。如果你這樣做了,你應該可以用你的容器調用構造函數,然後使用Items屬性來獲取一個DebuggerViewItem數組,其中包含你的配置中的警告和錯誤的名稱,描述等。

希望這會有所幫助,因爲我當然可以看到爲什麼您可能希望能夠在不使用調試器的情況下查看錯誤。 (例如,在單元測試中)