Но давайте предположим, что у меня есть пакет многократного использования с некоторыми интерфейсами и их реализацией. Я хотел бы связать этот интерфейс с реализацией.
Почему ваш повторно используемый пакет предоставляет интерфейс и реализацию?
Вы можете предоставить конкретные классы, если Ваш повторно используемый пакет - библиотека . Как я пишу в DI-Friendly Framework :
Библиотека - это многократно используемый набор типов или функций, которые вы можете использовать в самых разных приложениях. Код приложения инициирует связь с библиотекой и вызывает ее.
В соответствии с принципом обращения зависимостей (DIP) клиент определяет абстрактный интерфейс своих зависимостей. Любой интерфейс, предоставленный библиотекой, будет нарушать DIP.
С другой стороны, ваш повторно используемый пакет может предоставить абстракцию (интерфейс или базовый класс), если вы ожидаете, что клиентский код предоставит реализацию. В этом случае пакет начинает больше походить на фреймворк, хотя там, вероятно, есть серая область. Обычно в таких случаях пакет не должен предоставлять какие-либо реализации интерфейса, или он может предоставлять некоторые для необязательного использования.
Возможно, существуют некоторые крайние случаи, когда оба интерфейса и (по умолчанию) реализация доставки с тем же пакетом может иметь смысл, но я не понимаю, как это оправдывает нечто большее, чем фабрика по умолчанию, которую рекомендует Якуб Массад. Вы можете сделать этот API Fluent Builder - это обычный шаблон для такого рода сценариев.
Вы можете предоставить все XML файлы конфигурации, которые вам понадобятся sh, если вы не хотите, чтобы кто-либо использовал ваши пакет.