
Я сделал простейшую утилиту для регистрации в контейнере по атрибутам на интерфейсе\реализации. Добавил тесты а так же поддержку 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 раз, достаточно указывать атрибуты.
Для импорта из сборок без атрибутов по прежнему придется использовать сторонние утилиты.
Исходники лежать здесь.
ссылка на оригинал статьи https://habr.com/ru/articles/935016/
Добавить комментарий