使用 TypedParameter 的 Autofac Resolve 总是首先获取预期的相同类型参数?

Autofac Resolve with TypedParameter always pick up first the same type parameter expected?

我想在使用TypedParameter解析时传递参数。

似乎当AutofacTypedParameter创建实例时,它会用第一个相同类型的参数填充构造函数的参数。

是否符合预期?

让我们考虑一个例子:

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);

Second Assert 会失败,instance.b 也会是 First,这是预期的吗?为什么不把TypedParameter中的参数数组作为Constructor的参数列表传过去呢?

NamedParameter 可以解决这种情况,但我想知道 TypedParameter 的预期行为或目的,以及 NamedParameter 不支持但 TypedParameter 是吗?

A TypedParameter 将与指定的类型匹配,无论指定的顺序如何。

您可以使用PositionalParameter来匹配特定位置的参数

var instance = container.Resolve<A>(
                   new PositionalParameter(1, "First"),
                   new PositionalParameter(2, "Second")
                ); 

您还可以想象一个帮助创建参数的辅助方法

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"));

顺便说一句,如果你想匹配相同类型的参数,你可以使用NamedParameter

var instance = container.Resolve<A>(
                   new NamedParameter("a", "First"),
                   new NamedParameter("b", "Second")
                ); 

对于问题的第二部分,Parameter 可以由模块提供并提供给所有解析操作。无论参数的名称如何,每次请求特定类型时都会调用一个参数可能是有意义的。我经常使用 TypedParameter 而我几乎从不使用 NamedParameter