Автоматическая регистрация по атрибутам для .net

Я сделал простейшую утилиту для регистрации реализаций в контейнере.

Зачем?

В общем, на больших проектах с регистрациями в контейнере иногда можно ошибиться даже при merge. Плюс, если в проектах есть какие-нибудь IChainProcessor-ы в количестве более 5-10 штук - удобнее регистрировать их все через атрибут.

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

А затем просто вызовите UnityCommonRegistration.Register(container) для регистрации всех реализаций.

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

Для регистрации 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.

Указать LifetimeManagementType.

Вызвать UnityCommonRegistration.Register(container).

Так же, теперь чтобы вытянуть регистрации из сборки с данными атрибутами достаточно всего-лишь вызвать RegisterFromAnotherAssembly.

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

Как добавить свой контейнер?

переопределить 3 метода - registerInContainerregisterManyInContainer.

Написать свой маппинг для LifetimeManagementType.

Заключение

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

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

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

Использованные материалы:

1) https://stablediffusionweb.com - Изображение для публикации

@ValeriyPus
24.04.2025 10:15 UTC
Первоисточник

Комментарии

@ZetaTetra
24.04.2025 05:21 UTC
+2

Неплохо-бы добавить упоминание, или в теги, что это для Unity

@pashagoroshko
28.04.2025 06:52 UTC
-1

А нельзя называть определенно и потом по имени рефлексией получить все типы и зарегистрировать?

@withkittens
28.04.2025 12:59 UTC
0

Можно. Но если когда вы ошибётесь, и у вас что-то не зарегистрируется (или наоборот зарегистрируется что-то не то), вы будете долго сидеть с отладчиком. Явное обычно гораздо лучше неявного.