2010-12-02 6 views
2

ほとんどの引数を持つコンストラクタから、すべての定義済みコンストラクタを、最小のコンストラクタ(デフォルトのコンストラクタ)まで試してみることは可能ですか?私は何を意味ユニティとコンストラクタ

編集

foreach (var constructor in concrete.GetConstructorsOrderByParameterCount()) 
{ 
    if(CanFulfilDependencies(constructor)) 
    { 
     UseConstructor(constructor); 
     break; 
    } 
} 

私はUnityが唯一のほとんどのパラメータでコンストラクタを試してみたくありません。適切なコンストラクタが見つかるまで試し続けます。 Unityがこの動作をデフォルトで提供していない場合、これを行うための拡張機能などを作成することは可能ですか?

編集2

私は2つのコンストラクタを持つクラスを得た:

public class MyConcrete : ISomeInterface 
{ 
    public MyConcrete (IDepend1 dep, IDepend2 dep2) 
    {} 

    public MyConcrete(IDepend1 dep) 
    {} 
} 

クラスは複数のプロジェクトで使用されているライブラリに存在します。このプロジェクトでは、の第2のコンストラクタを使用したいと思います。しかしUnityは最初のコンストラクタによる依存関係を満たすことができないので停止します。そして私はではありません最初のコンストラクタは他のプロジェクトでDIによって使用されているので、クラスを変更したいと思います。

したがって、すべてのコンストラクタを解決しようとするUnityの必要性。

+1

「試してください」という正確な意味は? –

+0

もう一度...あなたは「適切」と言っています...この問題が浮上している場所でコードを提供してください。コンストラクタは、渡されているもの以外の外部のエンティティに一般に依存すべきではありません。例外などを投げてはいけません。私の答えを編集しました... –

+0

が質問を更新しました。 – jgauffin

答えて

3

[InjectionConstructor]属性を持つコンストラクタを明示的にタグ付けしないと、Unityが使用するコンストラクタを定義するまで、Unityは最も多くのパラメータを持つコンストラクタを選択します。

適切なコンストラクタを指定すると、それは環境にある程度左右されます。たとえば、Unityを使用するときに特定のコンストラクタが使用されることを常に保証したい場合は、前述の属性を使用します。それ以外の場合は、使用するコンストラクタを明示的に呼び出します。

すべてのコンストラクタを「試して」ユニティのポイントは何でしょうか?これは、型のインスタンスを切り離して提供することを目的としています。コンストラクタがその型のインスタンスを作成する場合、コンストラクタを繰り返し処理するのはなぜですか?

EDIT:

あなたは、ほとんどのparamsを持つコンストラクタはchild containerを利用することによって、そのコンテナ内でその型への参照を持っていないプロジェクト内で使用される可能性があります。これは、単一のパラメータでコンストラクタを強制的に使用することはありませんが、2つのパラメータを持つコンストラクタがプロジェクト全体で機能するようになります。

また、ボード全体で単一のコンストラクタを使用することに切り替えて、コンストラクタインジェクションではなく別のDI(Property Injection)フォームを使用して強制することもできます。センス。

+0

私は何かを明確にしたかっただけです。属性はコンテナにどのコンストラクタを呼び出すかを伝えることでした。また、apiファイルまたはconfigファイルを使用することもできます。いずれかが属性よりも好ましい。 –

+0

@Chris私はある程度属性タグのファンです。おそらくコンストラクタはテストのためにのみ呼び出され、Unityがこれを呼び出すことは望ましくありません。ユニットテスト中に明示的なコンストラクタにタグを付けてUnityをバイパスすることは望ましくありません。 –

+0

私はそれを属性ではなくコンテナの設定を介して理想的に行います。アトリビュートはコードをコンテナに結合します。また、クラス作成者として、自分のクラスのすべてのユーザーに対して、私が実際に作成するものではないことを前提にしています。 –

関連する問題