0

SimpleInjector驗證功能不時突出了我需要解決的問題。然而,我有一對夫婦,我舒服的「勢」的問題,我想告訴SimpleInjector,這些都OK,只是告訴我剩下的一些方法...SimpleInjector驗證 - 是否可以將警告標記爲可接受的,以使*新*項目顯而易見?

  • 配置警告警告在多個組中已被檢測到。
    • 潛在的生活方式不匹配1個服務可能不匹配。
      • IObjectMaterializedSubscriber ObjectMaterializedSubscriber(Lifetime Scope)取決於IEventPublisher(瞬態)。
    • 潛在的單一責任違規2可能的違規。
      • ILetterGenerator<A>LetterGenerator<A>有9個依賴項,可能表示違反了SRP。
      • ILetterGenerator<B>LetterGenerator<B>有9個依賴關係,可能表示違反了SRP。

的第一個警告IEventPublisher瞬態優良。 另外兩個警告(我假設)是由我使用SimpleInjector Decorator工具建立責任鏈而引起的。

我希望能夠將這些特定的警告標記爲已接受,以便容器可以報告一切似乎沒問題!

這可能嗎?

+0

註冊裝飾者不應觸發此警告。 「警告是由......建立責任鏈引起的」,你究竟意味着什麼?有多少構造函數參數具有'LetterGenerator '? – Steven 2013-05-02 21:22:08

+0

@Steven它有5個 - 其餘的是假設,因爲只有5個服務被注入。 – qujck 2013-05-02 21:22:51

回答

0

我希望能夠將這些特定的警告標記爲已接受[012]是 這可能嗎?

不,目前(2.2.3)版本沒有辦法做到這一點。整個診斷API是內部的。可以在單元測試中觸發診斷驗證using reflection,並過濾出您不感興趣的警告。如果還有任何警告,則可以讓測試失敗。

這是可能的,但確實需要一些工作,並且在大多數情況下您不希望有任何潛在的生活方式不匹配違規行爲。 documentation about the Potential Lifestyle Mismatches指出:

不要忽略這些警告。對於此警告的誤報爲 很少見,即使發生這種情況,註冊或應用程序設計也總是可以以警告消失的方式進行更改。

在你的情況下,你的終身範圍實例是指一個瞬態,你似乎意識到這種可能的風險,你似乎已經檢查,這不是問題。儘管如此,如果您沒有明確地記錄這些信息,這可能會在將來發生類更改時成爲問題,而其他開發人員可能會誤導。

通常有多種方法可以解決這個問題。例如,您可以將瞬態依賴性提升爲生命週期範圍,但您可能已經考慮過這一點。另一種選擇是讓ObjectMaterializedSubscriber不是靠一個短暫IEventPublisher,但在一個單Func<IEventPublisher>,可註冊如下:

container.RegisterSingle<Func<IEventPublisher>>(
    () => container.GetInstance<IEventPublisher>()); 

這使得ObjectMaterializedSubscriber的代碼溝通清楚,它希望得到一個對象用更短的生活方式,即使那IEventPublisher被要求一次。

另外兩個警告(我假設)是由我使用SimpleInjector Decorator工具創建責任鏈的原因。

不幸的是,你偶然發現了2.2.1版本中的一個錯誤。問題不是由添加裝飾器引起的,而是由於使用了未註冊的類型解析。該錯誤已在2.2.3中修復。

UPDATE

由於簡單噴油器2.4有一個Diagnostics API,讓您與診斷服務程序進行交互。這使您可以編寫單元測試並過濾掉任何不需要的警告,然後讓單元測試驗證您是否沒有任何警告。例如:

[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)); 
} 
相關問題