Как стать автором
Поиск
Написать публикацию
Обновить

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

Уровень сложностиСредний
Время на прочтение2 мин
Количество просмотров369

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

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

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

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Атрибуты для регистрации в контейнере — круто или нет?
66.67%Да2
33.33%Лучшая статья в хабах C#\.net за год1
Проголосовали 3 пользователя. Воздержались 7 пользователей.
Теги:
Хабы:
0
Комментарии0

Публикации

Ближайшие события