我可以使用类型参数注册Func工厂吗?

时间:2019-03-15 13:41:08

标签: c# generics autofac

我发现自己需要在多个地方收集给定类型的集合,并使用该类型创建一个新的类实例。新类已经具有类型参数:

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>类并完成该工作?

1 个答案:

答案 0 :(得分:3)

Autofac 具有对集合(包括列表)的内置支持。参见Implicit Relationship Types from the documentationRegisterGeneric方法允许注册开放类型(通用类型)。

builder.RegisterGeneric(typeof(Foo<>)).As(typeof(IFoo<>);
builder.RegisterType<Service1>().As<IService>();
builder.RegisterType<Service2>().As<IService>();

Autofac 将解析IFoo<IService>时,它将为List<IService>提供所有已注册的IService

相关问题