Могу ли я зарегистрировать фабрику Func с параметрами типа? - PullRequest
0 голосов
/ 15 марта 2019

Мне нужно в некоторых местах взять коллекцию данного типа и создать новый экземпляр класса с этим типом. Новый класс уже принимает аргумент типа:

public class Foo<T>
{
    public List<T> MyList { get; set; }

    public Foo<T>(List<T> list)
    {
        this.MyList = list;
    }
}

Первоначально я думал, что для этого нужно настроить фабрику, но потом я подумал, что он может так же легко войти в модуль Autofac, как и фабрика Func, поэтому я попробовал следующее:

builder.Register<Func<List<T>, Foo<T>>>(x => list => new Foo<T>(list));

Я получаю ошибки, потому что он не знает, что делать с T, я не могу заставить свой модуль принимать аргумент типа. Есть ли способ заставить эту регистрацию работать или я должен просто создать класс FooFactory<T> и покончить с этим?

1 Ответ

3 голосов
/ 16 марта 2019

Autofac имеет встроенную поддержку для сбора (включая список).См. Неявные типы отношений из документации .Методы RegisterGeneric позволяют регистрировать открытый тип (общий).

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

Когда Autofac разрешит IFoo<IService>, он предоставит List<IService> со всеми зарегистрированными IService

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...