0

SimpleInjector の検証機能により、修正が必要な問題が浮き彫りになることがあります。ただし、私が満足している「潜在的な」問題がいくつかあります。SimpleInjector に問題がないことを伝える何らかの方法が必要です。残りについて教えてください...

  • 構成警告 複数のグループで警告が検出されました。
    • 潜在的なライフスタイルの不一致 1 つのサービスに対して 1 つの不一致の可能性があります。
      • IObjectMaterializedSubscriber ObjectMaterializedSubscriberIEventPublisher(生涯スコープ) は(一時的)に依存します。
    • 潜在的な単一責任違反 2 つの違反の可能性。
      • ILetterGenerator<A> LetterGenerator<A>には、SRP 違反を示している可能性のある 9 つの依存関係があります。
      • ILetterGenerator<B> LetterGenerator<B>には、SRP 違反を示している可能性のある 9 つの依存関係があります。

一時的なものとしての最初の警告IEventPublisherは問題ありません。他の 2 つの警告 (私は推測しています) は、SimpleInjector デコレーター機能を使用して責任の連鎖を構築したことが原因です。

コンテナがすべて問題ないように見えることを報告できるように、これらの特定の警告を承認済みとしてマークできるようにしたいと考えています。

これは可能ですか?

4

1 に答える 1

0

これらの特定の警告を承認済みとしてマークできるようにしたい [...] これは可能ですか?

いいえ、現在の (2.2.3) リリースではそれを行う方法はありません。診断 API 全体が内部です。単体テストでリフレクションを使用して診断検証をトリガーし、関心のない警告を除外することができます。警告が残っている場合は、テストを失敗させることができます。

これは可能ですが、いくつかの作業が必要であり、ほとんどの場合、潜在的なライフスタイルの不一致違反は望ましくありません。潜在的なライフスタイルの不一致に関するドキュメントには、次のように記載されています。

これらの警告を無視しないでください。この警告の誤検知はまれであり、発生した場合でも、警告が消えるように登録またはアプリケーションの設計を常に変更できます。

あなたの場合、Lifetime Scoped インスタンスは一時的なものを参照しており、これの潜在的なリスクを認識しているようで、これが問題ではないことを確認したようです。それでも、将来クラスが変更されたときにこれが問題になる可能性があり、明示的に文書化しないと他の開発者が誤解を招く可能性があります。

多くの場合、これを修正するには複数の方法があります。たとえば、一時的な依存関係を有効期間のスコープに昇格させることができますが、おそらくこれは既に検討済みです。もう 1 つのオプションは、 を transientではなく singleton にObjectMaterializedSubscriber依存させることです。これは次のように登録できます。IEventPublisherFunc<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));
}
于 2013-05-04T23:59:17.577 に答える