Mono 为什么解析集合也会创建1个元素?
我在Mono上使用Autofac 3.5.2,当我尝试注册一个泛型集合并解决它时,我得到了一个正确的实例,其中已经添加了一个正确类型的元素。要用代码进行解释: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
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 resolveList
时,它将选择带有IEnumerable
的构造函数,然后resolveIEnumerable
将解析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!