1

依存関係の存続期間に関して、またはDIコンテナの存続期間中に行われた、依存関係の注入など、反映によって決定される依存関係は、登録された依存関係とは異なりますか?Unityでは、依存関係はリフレクションによっていつ決定されますか?

編集:DIコンテナはUnityです。

編集:エラボレーション:リフレクションプロセスが何回起こったのか不思議で、天気に関する明快さが求められたり、反射を使用するUnityビルドのステージでコンストラクタやプロパティが見つかることはありません。 MSDN(Source)によると、Unityビルドの第4段階は、「Precreation」が「第4段階です。コンストラクタやプロパティなどのリフレクションはここで実行されます」。このステージは何回実行されますか?コンテナの構築中に、またはコンストラクタとプロパティの依存関係を解決する必要があるたびに、一度ですか? Register Resolve Releaseパターンのどの部分でこれが発生しますか?

+1

各DIコンテナは異なる方法で動作します。あなたは特別なことを念頭に置いていますか? –

+0

はい、私が作業しているDIコンテナはUnityです。それを反映させるために質問を編集しました。 –

+0

ここには何が尋ねられているのかが私にはっきりしていません。あなたは精緻化できますか?おそらくあなたの尋問の理由が含まれていますか? –

答えて

2

Unityは、オブジェクトを作成するためにStrategyChainというビルドパイプラインを使用します。このパイプラインは、オブジェクトをコンテナから解決するたびに実行されます。

パイプラインの各ステップは戦略として実装されています。これらの戦略では、BuilderPoliciesと呼ばれる検索値が使用されます。これらのポリシーは、戦略が蓄積した情報をカプセル化します(リフレクションを使用してどのコンストラクタを使用するか、どのプロパティを注入するかなどを決定するなど)。最初に特定の種類のパイプラインを実行すると、ポリシーはPolicyListというストアにポリシーを配置します。次回パイプラインにそのタイプのビルドが要求されると、それらの値は再利用されるため、関連する作業には一度のコストがかかります。


UPDATE

私はあなたがASP.NETを意味すると思いますか?実際には2つのPolicyListsがあります。 StrategyChain(トランジェント)を介して1つのサイクルでのみ存在し、コンテナの寿命に繋がるもの。 UnityContainerのインスタンスが廃棄されていないかガベージコレクションされている限り、それは存続します。興味深いものが1つあります。コンテナをシリアル化することはできません。したがって、Webファーム上で実行されているアプリケーションに、キャッシュに格納してサーバー間で共有するように指示することはできません。

+0

PolicyListの有効期間はどのくらいですか? .netのシナリオでは、それはセッションごとですか? –

+0

更新いただきありがとうございます、私はそれを感謝します。解決されたすべてのオブジェクトが直ちに解放されると仮定します(0msに近づくのに時間がかかるようにします)。オブジェクトを100回解決して解放すると、(コンテナがガベージコレクションされていない限り)リフレクションを使用してパイプラインを1回だけ判定します。 –

+1

@ TravisJあなたのオブジェクトが一過性/一生解決ごとに登録されている場合、それらは解決され、使用され、他のCLRオブジェクトと同様にガベージコレクトされます。シングルトンライフタイムで登録されている場合、その単一インスタンスは再利用され、したがって収集されません。最初の解決後、コンテナが再び反射を使用する必要はありません。 –

関連する問題