2015-09-18 2 views
1

Предположим, у меня есть проект A, который ссылается на проект B. B имеет некоторые классы, определенные в нем, а A имеет интерфейс ISomething, реализация которого находится в A и использует классы B. Затем я хочу создать проект C и другую реализацию интерфейса A, которая использует классы C. Вот проблема: я хочу переместить реализации этого интерфейса в соответствующие проекты, чтобы я мог определить, какой проект я хочу использовать в скрипте сборки, и опустить другие. Тем не менее я хочу сохранить связь между интерфейсом и его реализацией ради тонны уже существующего кода, который использует этот интерфейс. До сих пор я размышлял над следующими опциями:Разделительные интерфейсы и реализации

  • Использовать шаблон адаптера в проекте A, который возвращает ISomething, ссылается на обе реализации и адаптирует реализацию B, если C отсутствует, и наоборот. Кон, что делает все отношения между интерфейсом и реализацией бесполезными с моей точки зрения
  • Создайте проект D, который содержит интерфейс и на который ссылаются A, B и C, а затем разрешите в этом проекте интерфейс с одной из его реализаций , Проект получает конкретный экземпляр и работает с ним. Кон, что мне нужно создать другую библиотеку и загрязнить репозиторий.

Какой вариант лучше и есть ли другие?

+0

Вам нужно продолжать реализацию в отдельных проектах по какой-то причине? т. е. не хотите, чтобы этот код существовал в определенных сборках? –

+0

Мой главный проект предназначен для нескольких платформ, и я использую скрипт для генерации определенных файлов решений в зависимости от параметров, с которыми выполняется этот скрипт. Я хочу определить новый параметр, который укажет, какой проект я хочу использовать в решении (B или C), поэтому я хочу переместить реализации в отдельные проекты –

ответ

2

Я бы определенно пойти на Project D.

Иногда вы увидите его в решениях, где интерфейсы даже не разделяемых или предназначены для совместного использования, и это явно перебор, но я бы сказал, что для вашего ситуации это был бы лучший способ сделать это.

Теперь, что вы можете сделать, это не просто оставить его в качестве DLL или ссылки проекта, потому что

  1. Вы должны собрать и связать этот проект, и это займет некоторое время. Даже если в этом проекте нет кода, время связывания все равно будет происходить.
  2. У вас не будет простой возможности для версии вашего интерфейса, поэтому редактирование интерфейса в одном проекте с нарушением изменений потребует немедленного распространения в других проектах, и вы не узнаете, сделали ли вы это уже.

Чтобы избежать этих двух проблем, я хотел бы создать NuGet пакет из этого проекта D. Вам не нужно размещать его на NuGet.org, вы можете просто самостоятельно хозяин его, либо с локальный сервер или самый простой способ: указав на локальную или общую папку.

Смежные вопросы