Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用TypedParameter的Autofac Resolve始终首先拾取预期的相同类型参数?_C#_Autofac - Fatal编程技术网

C# 使用TypedParameter的Autofac Resolve始终首先拾取预期的相同类型参数?

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

我想在使用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 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")
                );