#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
Это дает понять, что здесь мы ориентируемся на бизнес-уровень, и если рассматриваемый тип перемещается в другой проект, здесь будет ошибка компиляции.