だから、私は他の誰かがすでに遭遇したと確信している問題を解決しようとしています. 基本的に、IoC コンテナーへの呼び出しで依存関係を再帰的に解決する必要がありますが、カスタム コードを実行して、事前定義された一連の基準に基づいて結果を変更する可能性もあります。ややこしいので、例を挙げます。
次のようなコントローラーがあるとします。
public class SampleController : Controller
{
protected SampleType _sampleType = null;
public SampleController(SampleType sampleType)
{
_sampleType = sampleType;
}
}
このコントローラーのテスト バージョンもいくつかあります (たとえば、リファクタリングを行い、AB テストで露出をテストして、本番環境でひどく壊れないようにしたいとします)。
public class SampleController_V2 : SampleController
{
protected SampleType _sampleType = null;
protected AnotherType _anotherType = null;
public SampleController_V2(SampleType sampleType, AnotherType anotherType)
{
_sampleType = sampleType;
_anotherType = anotherType;
}
}
DefaultControllerFactory
コントローラーを作成するときに Unity を使用するように拡張しました。これはすべて正常に機能しています。今、私がやりたいことは、解決すべきことがあれば、階層内の特定のタイプを AB テストする機能を提供することです。これはトップ レベルではうまく機能しますが、オブジェクト グラフを再帰的に処理するため、子要素では機能しません。
現在、適切なコントローラーを選択して解決し、依存関係を与えます。ただし、依存関係への個々の呼び出しをインターセプトして、それらを AB テストすることもできないようです。データベース構成を通じてテストを定義し、IOC コンテナーに基準に基づいてテストを解決させることができます。例:
SessionIds that start with the letter 'a': SampleController_V2
Everyone Else : SampleController
UserIds ending in 9 : SampleType_V2
Everyone Else : SampleType
これはすべてトップレベルのアイテムで機能します。ただし、への呼び出し_unityContainer.Resolve(type)
は再帰呼び出しではないようです。タイプを解決しようとするときに、そのコードを任意のポイントに挿入できるようにしたいと思います。
-> Attempt to Resolve SampleController
-> Test Code Tells Us to use _V2 if possible.
-> Attempt to Resolve SampleType
-> Test Code tells us to use the _V1 if possible.
-> Resolves SampleType_V1
-> Attempt to Resolve AnotherType
-> No Test Defined, Use the Default
-> Resolves AnotherType
-> Resolves SampleController_V2 (passing SampleType_V1 as the dependency and then AnotherType as the other dependency)
いくつかのオンライン記事を見ると、ある種の Unity インターセプターを使用する必要があるように思えますが、この時点で、ある種のテスト アーキテクチャが組み込まれた独自の IoC コンテナーを作成しているようです。
うまくいけば、コンストラクターを見つけて各タイプを再帰的に解決するという苦痛に陥る前に、誰かがこれを行う方法について良い考えを持っていることを願っています.
編集: したがって、各依存関係のコンストラクターパラメーターを再帰的に検査して独自のインジェクションを作成することは、実際にはそれほど恐ろしいことではありませんが、独自のカスタムソリューションのために Unity を捨てると、上司が少し動揺する可能性があると思います.