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