Четкое указание сборок для автоматической регистрации

#c# #.net #autofac

#c# #.net #autofac

Вопрос:

Наше приложение использует Autofac в качестве контейнера IoC и использует автоматическую регистрацию для нескольких сборок, содержащих широко используемый код.

Для ссылки на каждую сборку обычно используется Assembly.GetAssembly(typeof(<type>)) , используя один из типов в соответствующей сборке. Это, однако, не очень понятно, потому что нелегко увидеть, какая сборка зарегистрирована через каждый тип, и это также может привести к ошибкам при перемещении типов между проектами.

Чтобы решить эту проблему, в каждой рассматриваемой сборке я создал пустой класс с именем Types , который, конечно, имеет пространство имен сборки, поэтому я могу выполнить автоматическую регистрацию следующим образом:

 builder.RegisterAssemblyTypes(
    Assembly.GetAssembly(typeof(Xx.Common.Types)),
    Assembly.GetAssembly(typeof(Xx.Core.Types)),
    Assembly.GetAssembly(typeof(Xx.Infrastructure.Types)))
    .AsSelf()
    .AsImplementedInterfaces();
 

В противном случае это, конечно, «мертвый код». Хорошая или «умная» идея сделать это таким образом, или есть лучшая, более идиоматичная? Я тупой, что даже потрудился спросить об этом?

Ответ №1:

Я думаю, что то, что вы делаете, на самом деле довольно умно. Подход, который я использую, аналогичен, но вместо создания нового типа я указываю на существующий тип (как и вы), но полностью указываю его имя следующим образом:

 typeof(global::Company.Product.BusinessLayer.ICommandHandler<>).Assembly
 

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