Автоматическая регистрация в контейнере по атрибутам — теперь с IServiceCollection и тестами

от автора

Я сделал простейшую утилиту для регистрации в контейнере по атрибутам на интерфейсе\реализации. Добавил тесты а так же поддержку IServiceCollection.

Зачем?

Убрать весь бойлерплейт регистраций в контейнере.

На больших проектах с регистрациями в контейнере иногда можно ошибиться даже при merge.

Если в проектах есть какие-нибудь IChainProcessor-ы в количестве более 5-10 штук — удобнее регистрировать их все через атрибут.

Ситуации с тем, что написал сервис(ы), но забыл зарегистрировать в контейнере теперь исключены.

[TypeRegistration(LifetimeManagementType.PerThread)] internal interface I1 {       public void Action1();       public void Action2(); }

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

Для регистрации Mock в Debug конфигурациях можно (и нужно) использовать директивы препроцессора #if.

Так же вы можете переопределить LifetimeManagement для любых реализаций.

[DerivedTypeRegistration(LifetimeManagementType.Singletone)] internal class C1 : I1 {       public void Action1()     {         var a = 1 + 2;     }       public void Action2()     {         var b = 3 + 4;       } }

Самое смешное, что 2 атрибута обеспечивают все возможные типы регистрации в контейнере.

Как пользоваться?

Устанавливаем атрибуты регистрации

Добавить TypeRegistrationAttribute на интерфейс, реализации которого хочется регистрировать в контейнере.

Добавить DerivedTypeRegistrationAttribute на реализацию чтобы переопределить LifetimeManagement.

Запускаем регистрацию

Вызвать 

servicesCollection.RegisterByAttributes();

Чтобы вытянуть регистрации из сборки с данными атрибутами достаточно всего-лишь вызвать 

servicesCollection.RegisterByAttributes(myExternalAssembly);

Теперь все реализации зарегистрированы в контейнере.

А это протестированно?

Да, написано 14 тестов.

Тесты:

1 к 1

1 к N

1 к 1 переопределение Lifetime

1 к N переопределение Lifetime

Все это для:

1) простых интерфейсов с простыми реализациями

2) Generic интерфейсов с простыми реализациями

3) и Generic интерфейсов с Generic реализациями

4) Так же есть тесты на смешанные кейсы

Заключение

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

Для импорта из сборок без атрибутов по прежнему придется использовать сторонние утилиты.

Исходники лежать здесь.

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

Атрибуты для регистрации в контейнере — круто или нет?

50%Да1
50%Лучшая статья в хабах C#\.net за год1

Проголосовали 2 пользователя. Воздержались 5 пользователей.

ссылка на оригинал статьи https://habr.com/ru/articles/935016/