我发现自己需要在多个地方收集给定类型的集合,并使用该类型创建一个新的类实例。新类已经具有类型参数:
public class Foo<T>
{
public List<T> MyList { get; set; }
public Foo<T>(List<T> list)
{
this.MyList = list;
}
}
我最初的想法是为此建立一个工厂,但是后来我认为它可以像Func工厂一样轻松地进入Autofac模块,因此我尝试了以下方法:
builder.Register<Func<List<T>, Foo<T>>>(x => list => new Foo<T>(list));
我在这里遇到错误,因为它不知道如何处理T
,我无法使我的模块接受类型参数。有没有办法使此注册有效,还是我应该创建一个FooFactory<T>
类并完成该工作?
答案 0 :(得分:3)
Autofac 具有对集合(包括列表)的内置支持。参见Implicit Relationship Types from the documentation。 RegisterGeneric
方法允许注册开放类型(通用类型)。
builder.RegisterGeneric(typeof(Foo<>)).As(typeof(IFoo<>);
builder.RegisterType<Service1>().As<IService>();
builder.RegisterType<Service2>().As<IService>();
Autofac 将解析IFoo<IService>
时,它将为List<IService>
提供所有已注册的IService