2010-12-06 9 views
3

私はすでに次のことを行っている:ユニティ自動注入

  1. ILoggerですインタフェースを介して、団結の私のロガー のインスタンスを登録します。
  2. インタフェースを作成しました。 ILoggableObject。メソッドがあり、 フック(ILogger logger)を使用して、ロガーを挿入できます。

私はこれを実現したいと思います。そのオブジェクトがILoggableObjectを実装している場合

毎回私は自動的にフックメソッドを経由してILoggerですインタフェースを注入し、ユニティから任意の解像度を求めます。

私はこれが傍受またはポリシーによって可能だと思いますか?

ご協力いただければ幸いです。

+3

デフォルトのメカニズムであるコンストラクタインジェクションを使用しないのはなぜですか?単に 'Hook'メソッドの名前をpublicコンストラクタ(同じ引数を持つ)に変更してください。 – Steven

+0

ロギング動作を使用する必要があるオブジェクトctorにILoggerを渡すだけではどうですか? –

+0

それは私がそれをやっていた方法です。このアプローチの問題は、オブジェクトが複数のインタフェースを使用し始めたときに、10個のパラメータを持つコンストラクタで終わることです。その後、その基本クラスから継承したい別の開発者は、見る必要がないすべてのコンストラクタパラメータを提供する必要があります。 – poindexter12

答えて

2

あなたが探しているものはUnityのTypeInterceptionです。ここを参照してください:http://msdn.microsoft.com/en-us/library/ff660861(PandP.20).aspx

また、ここでhttp://msdn.microsoft.com/en-us/library/ff660848(v=PandP.20).aspx

あなたは、コンストラクタへの呼び出しをインターセプトし、それらを任意の賢明されずに呼び出し元のコードに代わってロガーを注入します。

私はあなたがIntercept.NewInstanceを(使用してやりたいことができると信じて前に、私はそれを行っていないが)http://msdn.microsoft.com/en-us/library/ff662093(PandP.20).aspx

+1

私が尋ねた質問にお答えいただきありがとうございます。 – poindexter12

1

これは、依存性注入を(試みる)恐ろしい方法です。 コンストラクタインジェクションを代わりに使用し、ILOGgerをHookメソッドがあるコンシューマに(コンストラクタ経由で)注入します。

+0

これは私の質問に全く答えません。私はフィードバックを感謝しながら、私は上記の私のコメントのためにその方法から変換しています。 – poindexter12

+2

しかし、その理由は間違いです。コンストラクタ引数が多すぎるというのは、コンストラクタインジェクションが間違っていることを示すものではなく、クラスがあまりにも多くの責任を負っていることを示しています。http://stackoverflow.com/questions/2420193/dependency-injection -constructor-madness/2420245#2420245 –

+0

さて、あなたのブログ記事を読んだ。それは素晴らしい。私はあなたのすべての原則に同意します。私はあなたが私の質問に答えようとしているとは思わない。コンストラクタインジェクションが好きな人は、プロパティやメソッドインジェクションが好きかもしれません。プリンシパルは同じです。私はすべての私の付帯サービスを1つの集約サービスに集約することが良いことに同意します。私はすぐにこれを行うことに目を向けます。私の質問はまだ立っています。メソッドやプロパティを介して自動的に注入したい集約サービスが1つあれば、どうすれば自動的に行うことができますか? – poindexter12

0

私は本当にUnityとのIoC/DIのように、私はそれがあることはよく分からないもののあなたがしたいことを達成するための正しいツールです。

PostSharpまたは同様のツールを使用して、アスペクト指向プログラミングを検討することを検討してください。これにより、計装されているクラスを変更することなく、ロギングやその他のクロスカッティングの問題を追加することができます。