使用 TypedParameter 的 Autofac Resolve 总是首先获取预期的相同类型参数?
Autofac Resolve with TypedParameter always pick up first the same type parameter expected?
我想在使用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);
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
我想在使用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);
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