RegisterMany не регистрирует все интерфейсы

avatar
GioviQ
8 апреля 2018 в 08:38
528
1
2

Я использую DryIoc, и это мой первый опыт работы с инфраструктурой внедрения зависимостей. В основном мне нужно зарегистрировать все классы, реализующие IService, как singleton. Для каждой реализации IService мне нужно зарегистрировать также все остальные интерфейсы. Я хотел бы сделать это с помощью одной инструкции. Итак, моя первая попытка была:

container.RegisterMany<IService>(Reuse.Singleton);

Я получаю DryIoc.ContainerException Регистрация абстрактного типа реализации IService, когда он должен быть конкретным. Также нет FactoryMethod для использования вместо

Погуглив, я нашел:

 container.RegisterMany(new[] { typeof(IService).Assembly }, type => type.IsAssignableTo(typeof(IService)),
            Reuse.Singleton, FactoryMethod.ConstructorWithResolvableArguments);

Но

resolver.ResolveMany<IOtherInterface>();

возвращает пустое перечисление.

Если я зарегистрирую каждую реализацию, например

container.RegisterMany<Service1>(Reuse.Singleton);
container.RegisterMany<Service2>(Reuse.Singleton);
...

все работает, но я полагаю, что есть способ сделать это без записи единого регистра для каждой реализации службы.

Источник

Ответы (1)

avatar
dadhi
8 апреля 2018 в 11:33
1

Это не работает, поскольку вы фильтруете типы служб (интерфейсов) вместо типов реализации.

Попробуйте это:

container.RegisterMany(
    typeof(IService).Assembly.GetLoadedTypes()
        .Where(t => t.IsAssignableTo(typeof(IService))),
    t => t.IsInterface, …);
GioviQ
9 апреля 2018 в 16:45
0

Я не могу найти конструктор для добавления Reuse.Singleton, который не вызывает DryIoc.ContainerException Регистрация абстрактной реализации...

dadhi
9 апреля 2018 в 20:00
0

> добавить конструктор Reuse.Singleton?

dadhi
9 апреля 2018 в 20:02
0

Абстрактный класс не может быть зарегистрирован как реализация, потому что это не то, что вы можете создать в С#. Но его можно зарегистрировать как тип службы для реализации неабстрактного класса.

GioviQ
10 апреля 2018 в 15:07
0

У меня нет абстрактных классов... Во всяком случае, сейчас я использую container.RegisterMany<Service1>(Reuse.Singleton); container.RegisterMany<Service2>(Reuse.Singleton); и container.ResolveMany<IService>(); возвращает оба синглтона, несмотря на то, что в документе я прочитал X, Y, A используют один и тот же синглтон

dadhi
10 апреля 2018 в 16:11
0

Один и тот же сингл RegisterMany гарантирует тот же синглтон. В противном случае, если у вас есть несколько регистров, используйте RegisterMapping, который также есть в документации.