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