Как повторно экспортировать типы из ссылочной сборки .NET
У нас есть большой проект .NET, состоящий из множества модулей, которые реализованы как проекты библиотек Visual Studio и скомпилированы в соответствующие сборки (DLL).
У нас многоуровневая архитектура, и мы управляем зависимостями между модулями / слоями, устанавливая ссылки между проектами / сборками Visual Studio. Это позволяет нам отделять API / SPI от реализаций и держать отдельные уровни разделенными, таким образом эффективно применяя ограничения нашей архитектуры.
Однако иногда нам хотелось бы (транзитивно) реэкспортировать типы, импортированные в одну сборку, в любую дополнительную сборку, которая имеет ссылку на импортирующую сборку.
Например, предположим, что типT
определяется в сборкеA
сборкаB
РекомендацииA
и сборкаC
РекомендацииB
, нравится:
A <-- B <-- C
Мы хотели бы «увидеть» типT
в сбореC
без явной установки ссылки наA
в сбореC
, Мы хотели бы как-тореэкспортировать ссылка наA
вB
вместо.
Является ли это возможным?
П. С. Почему мы хотим это сделать? Поскольку некоторые типы используются во всем приложении (например, классы утилит / помощников или общие интерфейсы), было бы раздражающим дублировать ссылки в каждом проекте, который зависит от этих типов. Кроме того, когда мы проводим рефакторинг нашего кода и перемещаем его, мы получаем много сообщений об ошибках из-за пропущенных ссылок.
РЕДАКТИРОВАТЬ
Чтобы уточнить, вот простая диаграмма.
Не только делаетConsumer B
зависит отB
но и наA
, посколькуB
продолжаетсяA
, Однако еслиA
определяется в другой сборке, чем сборкаB
тогда мы тожедолжен добавить ссылку на сборкуA
(то же самое относится и к провайдерам). Но нет актуальногонужно добавить эту ссылку, так как зависимость отA
следует от того, что мы зависим отB
а такжеB
продолжаетсяA
, Что нам действительно нужно, так это как-тореэкспортировать зависимостьB
наA
.
Как может возникнуть этот сценарий? Предположим, что был только один интерфейсB
и вы решили извлечь общий интерфейс (A
) изB
и поместите его в отдельную сборку, чтобы некоторые другие модули могли повторно использовать новый интерфейс без добавления зависимости от исходного интерфейса. И все: теперь вам нужно везде добавить ссылку на новую сборкуB
был использован раньше.