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 がすべてのコンストラクターを解決しようとする必要があります。

4

1 に答える 1

3

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

適切なコンストラクターを述べるとき。それは環境によって多少異なります。たとえば、Unity を使用するときに特定のコンストラクターが使用されることを常に保証したい場合は、前述の属性を使用します。それ以外の場合は、使用するコンストラクターを明示的に呼び出します。

Unity がすべてのコンストラクターを「試す」ことのポイントは何でしょうか? その目的は、分離された方法で型のインスタンスを提供することです。コンストラクターが型のインスタンスを作成する場合、コンストラクターを反復処理するのはなぜですか?

編集:

子コンテナを使用することにより、コンテナ内でそのタイプへの参照を持たないプロジェクト内で、最も多くのパラメータを持つコンストラクタを使用できるようにすることができます。これにより、単一のパラメーターを持つコンストラクターの使用が強制されることはありませんが、2 つのパラメーターを持つコンストラクターがプロジェクト全体で動作できるようになります。

また、単一のコンストラクターを全面的に使用するように切り替えて、コンストラクター インジェクションではなく、別の形式の DI (プロパティ インジェクション) を介して他のインターフェイスを強制することもできます。

于 2010-12-02T14:55:56.407 に答える