このIOCの行動(複数登録したコンポーネントを解決)の背後にある理由は何ですか
-
21-09-2019 - |
質問
は、IOCのための標準的なアプローチのように思えます
container.AddComponent<ILogger, HttpLogger>();
container.AddComponent<ILogger, SmtpLogger>();
var logger = container.Resolve<ILogger>();
コンポーネントを解決するときに、最初に登録さILoggerですが(HttpLoggerこの場合は)解決のための唯一の候補者であるということでしょう、IOCはそれはそれはすべての依存関係を解決できると信じてそれができる「太った」コンストラクタがあります。
しかし、それはうまくIOCとすることができる第1のロガーの依存関係を解決することはできません、とthusly解像度の問題に戻ります、よく、IOCがそれをしようとした場合SmtpLoggerが解決されている可能性がある場合である可能性があります。
だから、唯一の候補者として最初の登録されたサービスを利用するための推論は何ですか?それはとにかく使用していることをあなたが得るどのタイプの不確実性は、引数であるが、その後、IOCは、コンストラクタの担当に残っていると思われます。
なぜ、該当するすべてのタイプのすべてのコンストラクタから選択、および(実数型の不可知論)?
ダウン太っコンストラクタから解決しようと起動しませんこれは本当に明白な答えを持っているかもしれませんが、正直なところ、私はそれを知りません。
事前におかげで、 スティーブンます。
解決
この理由は、実装の複雑さに及ぼす影響である。
動作のこの種が実装されている場合、は、それは、例えば、再帰的に作業が判明しますロガーの一つの依存関係を満たすことができるかどうかを考え出すこと。
ののそのの依存関係などのすべての散歩が必要になります これを効率的に行うには、は困難であり、コンテナにし、デバッグ経験に多くの複雑さを追加します。
MEFは、厳密にはIoCコンテナながら、あなたが提案したものと同様の方法でこれを実行し - それは安定な組成物の挙動の一部であり、何か私たちは「拒否」とを参照してください。
。HTTP ://blogs.msdn.com/nblumhardt/archive/2009/07/17/light-up-or-mef-optional-exports.aspxする
は、高度に動的なプラグインシナリオでは、拒絶は極めて有用です。ウィンザーは、Autofacがターゲットとしているなどのシナリオでは、追加の努力はあまり報われません。