2011-11-10 11 views
3

DIについては、MicrosoftのUnityを使用しています。 私はRapier-LOOMを使っています。依存性注入と動的アスペクトウィービングの組み合わせ

アスペクトウィーバーではファクトリメソッドWeaver.CreateInstance(System.Type)を使用して織りオブジェクトをインスタンス化する必要があり、既存のインスタンスを織り交める方法はありません。

DIコンテナを使用すると、依存関係を解決し、注入された型のオブジェクトをインスタンス化するIUnityContainer.Resolve(System.Type)メソッドを使用して依存関係を解決できます。

これらの2つのアプローチは明らかに競合します。 この競合を解決するには、どのような方法が推奨されますか?私がこれまで持っていた

アイデア:

  • マッピングを問い合わせし、(IUnityContainer.Registrationsプロパティを使用して)依存関係を「手動で解決します」。解決するタイプを指定して、ターゲットのマップされたタイプを見つけ、ウィーバーを使用してインスタンス化する、結合された "DI + AOP"メカニズムを作成します。
  • (代わりにアクティベーターの)ウィーバーを使用してインスタンス化IUnityContainerインターフェイス、私の独自の実装を作成します

P.S.

私はここでオフトラックしていますが、解決されているのではなく競合が回避できる場合はお知らせください。

+0

興味深い質問!私の最初の印象は、メソッドの呼び出しを内部UnityContainerにマップする 'AUnityContainer'の新しい実装を作成することですが、AOPファクトリメソッドを使うために' Resolve'を再実装します。しかし、人々が他のアイデアを持っているなら、私は非常に興味があります。 –

+0

Unityが内部的にどのように動作するかを調べると、 'Resolve'を再実装することは決して簡単な作業ではなく、 'Resolve'メソッドを実行するために 'UnityContainer'によって使用されるメカニズムを再実装することもありません。 Rapier-LOOMのソースコードを確認すると、オブジェクトをインスタンス化する方法を変更することも重要ではありません...結果に達すると更新されます。 –

+0

Unityの独自の動的傍受機能を使ってみませんか? –

答えて

2

私はRapier-LOOMに慣れていないので、私は物事のUnity側からちょうど話します。さまざまな能力/複雑さの2つのアプローチがあります。彼らのどれもIUnityContainerを再実装する必要はありません。

あなたができる最も簡単なことは、InaverFactoryを使ってウィーバーを使って作成したい登録タイプです。これにより、既定の動作ではなくインスタンスを作成するために実行されるデリゲートを指定できます。このような何か:

container.RegisterType<ISomething>(
    new InjectionFactory(c => { 
     var newObject = (Something)Weaver.CreateInstance(typeof(Something)); 
     newObject.Property1 = c.Resolve<TypeOfProperty1>(); 
     newObject.Property2 = c.Resolve<TypeofProperty2>(); 
     return newObject; 
    }); 

あなたがcontainer.Resolve()を呼び出したときに続いて、そのデリゲートが実行されます。

Weaver.CreateInstance呼び出しを作成チェーンにフックするUnity拡張機能を作成する方法があります。メインの戦略チェーンでカスタム戦略を使用するか、ビルド計画を上書きすることができます。前者ははるかに簡単です。

Unityエクステンションを作成するための参考資料がありませんので、このテキストボックスにコードを入力しようとしません。 Unityの拡張機能の例についてはWebを参照してください。

2

LOOMコードプレックスページでは、Unityメソッドの代行受信を使用して実行できない機能は提供されていません。ここをクリックしてください:Aspect-Oriented Programming, Interception and Unity 2.0

+0

あなたの答えをありがとう、私は間違いなく迎撃に深く掘り下げます。この質問に対処するために、私はすぐに、2つの既存のソリューションを接続しようとするよりも、AOP + DIを組み合わせたソリューションがはるかに大陸であるという結論に達しました。+1 –

1

これは貧しい議論です。 MicrosoftのUnityが.NETフレームワークではできない機能を提供していないと言っても同じです。質問は、私の問題のための最高のプログラミングモデルは何ですか。答えは、要件を実装する必要があるコードの量である可能性があります。 AOP、特にRapier-LOOMNETは、単純なメソッドの導入施設ではありません。 AOPの目的は、クロスカット問題をカプセル化することです。そのためにはアドバイス、紹介、ジョインポイント変数、コードベースの注釈などが必要です。単純なTracingの例以上を実装したい場合は、メソッドの開始よりも強力な概念が必要です。

+0

あなた、wschultですか? –