Mono 为什么解析集合也会创建1个元素?

Mono 为什么解析集合也会创建1个元素?,mono,autofac,Mono,Autofac,我在Mono上使用Autofac 3.5.2,当我尝试注册一个泛型集合并解决它时,我得到了一个正确的实例,其中已经添加了一个正确类型的元素。要用代码进行解释: class Fake {} var builder = new ContainerBuilder(); builder.RegisterType<Fake>(); bilder.RegisterGeneric(typeof(List<>)); var scope = builder.Build(); var

我在Mono上使用Autofac 3.5.2,当我尝试注册一个泛型集合并解决它时,我得到了一个正确的实例,其中已经添加了一个正确类型的元素。要用代码进行解释:

class Fake {}

var builder = new ContainerBuilder();
builder.RegisterType<Fake>();
bilder.RegisterGeneric(typeof(List<>));

var scope = builder.Build();

var list = scope.Resolve<List<Fake>>();

Console.WriteLine(list.Count); // => prints 1!
类假{}
var builder=new ContainerBuilder();
RegisterType();
登记册通用(目录类型);
var scope=builder.Build();
var list=scope.Resolve();
Console.WriteLine(list.Count);//=>打印1!
这是意料之中的事吗?为什么?如何避免这种情况?

Autofac在解析服务时,默认情况下会尝试使用具有最多可用参数的构造函数

Autofac会自动为您的类使用构造函数,其中包含能够从容器中获得的大多数参数
>

List
包含一个构造函数,该构造函数采用
IEnumerable
。 当Autofac resolve
List
时,它将选择带有
IEnumerable
的构造函数,然后resolve
IEnumerable
将解析
T
的所有可用实例

如果您注册了多个
false
,Autofac将在您解决问题时解决所有问题。例如:

var builder = new ContainerBuilder();
builder.RegisterType<Fake1>().As<IFake>();
builder.RegisterType<Fake2>().As<IFake>();
builder.RegisterGeneric(typeof(List<>)); 

var scope = builder.Build();

var list = scope.Resolve<List<IFake>>();
Console.WriteLine(list.Count); // => prints 2!

除非您真的知道自己在做什么,否则我不会建议您删除默认行为。

我会反过来。我将更改Autofac的默认配置,以允许它仅使用单个公共构造函数解析类型,除非您真的知道自己在做什么。
var builder = new ContainerBuilder();
builder.RegisterType<Fake1>().As<IFake>();
builder.RegisterType<Fake2>().As<IFake>();
builder.RegisterGeneric(typeof(List<>)).UsingConstructor(Type.EmptyTypes);

var scope = builder.Build();

var list = scope.Resolve<List<IFake>>();

Console.WriteLine(list.Count); // => prints 0!
var builder = new ContainerBuilder();
builder.RegisterType<Fake1>().As<IFake>();
builder.RegisterGeneric(typeof(List<>)); 

var scope = builder.Build(ContainerBuildOptions.ExcludeDefaultModules);

var list = scope.Resolve<List<IFake>>();
Console.WriteLine(list.Count); // => prints 0!