これらの特定の警告を承認済みとしてマークできるようにしたい [...] これは可能ですか?
いいえ、現在の (2.2.3) リリースではそれを行う方法はありません。診断 API 全体が内部です。単体テストでリフレクションを使用して診断検証をトリガーし、関心のない警告を除外することができます。警告が残っている場合は、テストを失敗させることができます。
これは可能ですが、いくつかの作業が必要であり、ほとんどの場合、潜在的なライフスタイルの不一致違反は望ましくありません。潜在的なライフスタイルの不一致に関するドキュメントには、次のように記載されています。
これらの警告を無視しないでください。この警告の誤検知はまれであり、発生した場合でも、警告が消えるように登録またはアプリケーションの設計を常に変更できます。
あなたの場合、Lifetime Scoped インスタンスは一時的なものを参照しており、これの潜在的なリスクを認識しているようで、これが問題ではないことを確認したようです。それでも、将来クラスが変更されたときにこれが問題になる可能性があり、明示的に文書化しないと他の開発者が誤解を招く可能性があります。
多くの場合、これを修正するには複数の方法があります。たとえば、一時的な依存関係を有効期間のスコープに昇格させることができますが、おそらくこれは既に検討済みです。もう 1 つのオプションは、 を transientではなく singleton にObjectMaterializedSubscriber
依存させることです。これは次のように登録できます。IEventPublisher
Func<IEventPublisher>
container.RegisterSingle<Func<IEventPublisher>>(
() => container.GetInstance<IEventPublisher>());
これにより、一度要求されたObjectMaterializedSubscriber
としても、より短いライフタイムを持つオブジェクトを取得することを期待していることが、 のコードで明確に伝えられます。IEventPublisher
他の 2 つの警告 (私は推測しています) は、SimpleInjector デコレーター機能を使用して責任の連鎖を構築したことが原因です。
残念ながら、2.2.1 リリースでバグに遭遇しました。この問題は、デコレータを追加したことが原因ではなく、未登録の型解決を使用したことが原因でした。このバグは 2.2.3 で修正されています。
アップデート
Simple Injector 2.4 以降、Diagnostic Services とプログラムでやり取りできる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));
}