C# 使用TypedParameter的Autofac Resolve始终首先拾取预期的相同类型参数?
我想在使用TypedParameter解析时传递参数 似乎当Autofac使用TypedParameter创建实例时,它会用第一个相同类型的参数填充构造函数的参数 这是预期的吗C# 使用TypedParameter的Autofac Resolve始终首先拾取预期的相同类型参数?,c#,autofac,C#,Autofac,我想在使用TypedParameter解析时传递参数 似乎当Autofac使用TypedParameter创建实例时,它会用第一个相同类型的参数填充构造函数的参数 这是预期的吗 让我们考虑一个例子: public class A { public string a; public string b; public A(string a, string b) { this.a = a; this.b = b; } } var builder = new Bui
让我们考虑一个例子:
public class A
{
public string a;
public string b;
public A(string a, string b)
{
this.a = a;
this.b = b;
}
}
var builder = new BuildContainer();
builder.registerType<A>();
var container = builder.Build();
var instance = container.Resolve<A>(
new TypedParameter(typeof(string), "First"),
new TypedParameter(typeof(string), "Second"));
Assert.AreEqual("First", instance.a);
Assert.AreEqual("Second", instance.b);
第二个断言将失败,实例b也将是第一个,这是预期的吗?为什么不将TypedParameter中的参数数组作为构造函数的参数列表传递
NamedParameter可以解决这种情况,但我想知道TypedParameter的预期行为或用途,以及NamedParameter不能支持但TypedParameter支持的情况是什么?TypedParameter将与指定的类型匹配,无论其指定顺序如何
可以使用位置参数将参数与特定位置匹配
var instance = container.Resolve<A>(
new PositionalParameter(1, "First"),
new PositionalParameter(2, "Second")
);
对于问题的第二部分,参数可以由模块提供并用于所有解析操作。无论参数的名称如何,每次请求特定类型时都会调用一个参数是有意义的。对我来说,使用TypedParameter是很常见的,我几乎从不使用NamedParameter位置参数索引位置是基于零的
public static class PositionalParameterExtensions
{
public static IEnumerable<PositionalParameter> From(params Object[] args)
{
return args.Select((o, i) => new PositionalParameter(i, o));
}
}
var instance = container.Resolve<A>(PositionalParameterExtensions.From("first", "second"));
var instance = container.Resolve<A>(
new NamedParameter("a", "First"),
new NamedParameter("b", "Second")
);