2011-01-19 12 views
0

私はかなり一般的な問題だと思っていますが、私はそれを解決する良い方法を見つけることができません。Unityがそれを解決した後にオブジェクトの後処理を行う方法は?

のは、私はインターフェイスIFooを持っていると私はFooのインスタンスを作成するために、ユニティを使用しましょう:初期化後

class Foo : IFoo {} 
IFoo foo = Container.Resolve<IFoo>(); 

私がFooのオブジェクトを取り込み後処理FooPostProcためのメソッドを呼び出すしたいと思います(ないIFooインターフェース)Iは

return Container.Resolve<IFoo>(); 

と等価になりたいたとえば :

void FooPostProc(Foo obj){} 
Foo obj = new Foo(); 
FooPostProc(obj) ; 
return obj ; 

本質的には、Unityコンテナの設定(好ましくはxml)で、オブジェクトが作成された直後にオブジェクトの特定のインスタンスを呼び出すメソッドを指定したいと思います。元のFooオブジェクトにコンストラクタを追加することができないので、私はこれをやっています。

私は、Unity Interceptionを使用して可能かもしれないというヒントを見ていますが、それは非常に関わっているようです。これはUnityの設定を使用して達成することができる合理的に簡単な方法はありますか?

答えて

3

ここに2つのオプションがあります。

これを使用しない場合は、メソッドインジェクションが機能します。作成されたインスタンスを呼び出すようにメソッドを設定できます。複数の注入メソッドを使用している場合は、メソッド間で順序を保証するものではありませんが、機能します。これは、後処理メソッドが作成したオブジェクトのメソッドである場合にのみ機能します。

APIを介して、あなたが実行します。

container.RegisterType<IFoo, Foo>(
    // ... constructor, property configuration 
    new InjectionMethod("FooPostProc")); 

またはXMLで:

<register type="IFoo" mapTo="Foo"> 
    <method name="FooPostProc" /> 
</register> 

あなたはまた、単にコンストラクタにすることができますようにメソッドにパラメータを渡すことができます。

もう1つのオプションは、文書化されていますが、含まれているBuilderAwareStrategyを使用することです。コンテナに戦略を追加するには、小さなUnity拡張を記述する必要があります。

これを実行すると、Microsoft.Practices.ObjectBuilder2.IBuilderAwareインターフェイスを実装できます。解決プロセスの最後に、コンテナはIBuilderAware.OnBuiltUpを呼び出します。この場合も、解決されている型でメソッドを実装する必要があります。例えば

:後処理方法が解決されたオブジェクト上にない場合は

public class myClass : IBuilderAware 
{ 
.. regular class implementation.. 
public void OnBuiltUp(NamedTypeBuildKey buildkey) {} 
public void OnTearingDown() {} 
} 

、最速のものはInjectionFactory(APIのみ、ノーXML)を使用すると、あなたがやりたいことであろう。

関連する問題