代理人をコンポーネントとして登録すると、AutowiringParamは解決時にNamedParameterの優先順位を引き受けます。ここでAutofacが2つのコンストラクタの間で解決できない場合は、具体的に具体的に指定してください
は煮詰め例を示します。この場合
public class AParam { }
public class BParam : IParam { }
public interface IParam { }
public interface IAThing { }
public class AThing : IAThing
{
public AThing(AParam aParam) { }
public AThing(BParam anotherParam) { }
}
static void Main(string[] args)
{
IContainer c = (new ContainerBuilder()).Build();
var anotherBuilder = new ContainerBuilder();
anotherBuilder.RegisterType<AThing>().As<IAThing>().InstancePerDependency();
anotherBuilder.Register((context, parm) => new BParam()).As<BParam>().InstancePerDependency();
anotherBuilder.Update(c);
object aParam = new AParam();
//Throws exception, it's unable to decide which constructor to use....
var instance = c.Resolve(typeof(IAThing), new[] {new NamedParameter("aParam", aParam) });
}
、私は正確にNamedParameter「aParam」したいことを指定していますが、AutowiritingParameterはBParamのために記入することができますので、それは分かっていませんどちらのコンストラクタを選択するかは同じパラメータ長です。
私が言及した名前付きパラメータでAutofacが特定のコンストラクタに優先順位を付けるようにするにはどうすればよいですか?私のパラメータが無視されるようにする理由はありません。それは、AutowiringParameterを使用する場合です。
私は "UsingConstructor"を使うことができましたが、BParamがAParamから派生するとすぐに、同じあいまいさに戻ります。 ここでは、指定されたパラメータでコンストラクタを要求しています。 アイデア
編集:
がAutofacだけでエラーなしで、完全にユーザーが指定した名前のパラメータを無視して、あなたは文句を言わない気づくことができますあなたのコンストラクタのデフォルトパラメータを使用!
public class AThing : IAThing
{
public AThing(AParam aParam) { }
public AThing(BParam anotherParam, bool def = true) { }
}
あなたの 'Resolve'は' typeof(IAThing) 'を使用しますが、コンストラクタを指定しようとしている具体的なクラス' AThing'ではありません。また、[this](http://docs.autofac.org/en/latest/register/registration.html#selection-of-an-implementation-by-parameter-value)はあなたに何か助けを提供しますか?また、 "インスタンスを作成するデリゲートが宣言され、デリゲートファクトリが使用された場合、よりクリーンで型安全な構文を実現できます"デリゲートとデリゲートファクトリでこれを解決できるかもしれません。 – ErikE
こんにちはErik、 一般的に、私たちは依存関係注入のためにAutofacを使用していますので、解決しようとしているもの(おそらくテストモックアップ)ではなく、名前付きパラメータ "aParam"を持つコンストラクタです。 "AutowiringParameter"を使用してコンストラクタとして "aParam"コンストラクタに同じ "特殊性"(もしあれば)を割り当てる理由がわかりません 以前のバージョンのAutofacではこれまでも使用していました:/そのような無視私は特定のパラメータ名を必要としていました。(同じ問題の型パラメータ結果は同じ問題になります) あなたの返信ありがとう – GettnDer
詳細については、ここで説明しているように、アプリケーションコンポーネントが複数のコンストラクタを持つための反パターンです。 cuttingedge.it/blogs/steven/pivot/entry.php?id=97)。 – Steven