Как зарегистрировать типы в библиотеках классов с помощью vnext?

Есть ли способ зарегистрировать типы (т.е. репозитории) для приложения mvc 6 (vnext) в библиотеках классов dnx? Я не хочу вызывать AddTransient‹,>() в классе запуска сотни раз. Для n-уровневого приложения это не лучший подход.


person endeffects    schedule 27.07.2015    source источник
comment
Что вы подразумеваете под в библиотеках классов dnx?   -  person Yuval Itzchakov    schedule 27.07.2015
comment
Мне нравится перемещать сопоставление типов интерфейса с типами объектов в мои библиотеки классов, чтобы иметь среду плагинов.   -  person endeffects    schedule 27.07.2015


Ответы (2)


Базовое использование IoC vNext не имеет возможности сканирования/пакетной регистрации.

В вашем случае вы должны использовать некоторые из «больших» контейнеров ioc, таких как Ninject, Unity, StructrureMap...

person Marko M.    schedule 27.07.2015
comment
Что ж, я тоже пробовал это, но мне не удалось загрузить зависимости из ILibraryManager в ContainerBuilder, потому что Container должен быть собран до инициализации LibraryManager, - person endeffects; 27.07.2015

В библиотеках классов вы можете следовать тому же подходу, что и остальная часть фреймворка, который использует методы расширения на IServiceCollection. например. AddMvc, AddEntityFramework и т. д.

Для автоматической регистрации ничего не существует из коробки, но я создал библиотеку, которая дает вам атрибут [ServiceDescriptor], который вы можете использовать для привязки ваших интерфейсов к вашим классам (или просто применять к классу).

https://github.com/Blacklite/DependencyInjection/tree/master/src/Blacklite.Framework.DependencyInjection

Метод расширения AddAssembly(...) просто выполняет поиск всех ваших атрибутов [ServiceDescriptor] и добавляет их в коллекцию сервисов.

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

  1. Добавьте метод расширения, как указано выше, и пусть метод расширения просто вызовет services.AddAssembly(typeof(ExtensionClassInAssembly))

    Я считаю это упрощением, а также позволяет удалить метод AddAssembly и заменить его чем-то другим без необходимости изменять основной класс запуска.

  2. Добавьте вызов services.AddAssembly(typeof(TypeInAssembly)) в свой Startup.cs

person David Driscoll    schedule 27.07.2015
comment
Хорошая идея, но выглядит немного халтурно. :D Я хотел бы повторно использовать встроенные сервисы. Я привел здесь неработающий пример: stackoverflow.com/questions/31674104/ - person endeffects; 28.07.2015