Как повторно экспортировать типы из ссылочной сборки .NET

У нас есть большой проект .NET, состоящий из множества модулей, которые реализованы как проекты библиотек Visual Studio и скомпилированы в соответствующие сборки (DLL).

У нас многоуровневая архитектура, и мы управляем зависимостями между модулями / слоями, устанавливая ссылки между проектами / сборками Visual Studio. Это позволяет нам отделять API / SPI от реализаций и держать отдельные уровни разделенными, таким образом эффективно применяя ограничения нашей архитектуры.

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

Например, предположим, что типT определяется в сборкеAсборкаB РекомендацииAи сборкаC РекомендацииB, нравится:

A <-- B <-- C

Мы хотели бы «увидеть» типT&nbsp;в сбореCбез явной установки ссылки наA&nbsp;в сбореC, Мы хотели бы как-тореэкспортировать&nbsp;ссылка наA&nbsp;вB&nbsp;вместо.

Является ли это возможным?

П. С. Почему мы хотим это сделать? Поскольку некоторые типы используются во всем приложении (например, классы утилит / помощников или общие интерфейсы), было бы раздражающим дублировать ссылки в каждом проекте, который зависит от этих типов. Кроме того, когда мы проводим рефакторинг нашего кода и перемещаем его, мы получаем много сообщений об ошибках из-за пропущенных ссылок.

РЕДАКТИРОВАТЬ

Чтобы уточнить, вот простая диаграмма.

Не только делаетConsumer B&nbsp;зависит отBно и наA, посколькуB&nbsp;продолжаетсяA, Однако еслиA&nbsp;определяется в другой сборке, чем сборкаBтогда мы тожедолжен&nbsp;добавить ссылку на сборкуA&nbsp;(то же самое относится и к провайдерам). Но нет актуальногонужно&nbsp;добавить эту ссылку, так как зависимость отA следует&nbsp;от того, что мы зависим отB&nbsp;а такжеB&nbsp;продолжаетсяA, Что нам действительно нужно, так это как-тореэкспортировать&nbsp;зависимостьB&nbsp;наA.

Как может возникнуть этот сценарий? Предположим, что был только один интерфейсB&nbsp;и вы решили извлечь общий интерфейс (A) изB&nbsp;и поместите его в отдельную сборку, чтобы некоторые другие модули могли повторно использовать новый интерфейс без добавления зависимости от исходного интерфейса. И все: теперь вам нужно везде добавить ссылку на новую сборкуB&nbsp;был использован раньше.