Разница между связыванием файлов и добавлением другого проекта в качестве ссылки?

У меня есть ситуация, когда у меня есть функциональность, которую я хочу использовать в более чем 1 приложении. В частности, у меня есть Repository в форме библиотеки классов C#, содержащей такие вещи, как EF .edmx, репозиторий и UnitOfWork, которые достаточно универсальны для использования в разных приложениях.

Я разочарован тем, что не могу видеть картину более четко, потому что я должен четко понимать различия; и я делаю в точку. Однако я думаю, что не могу понять последствия каждого выбора и общие различия.

Я прочитал эту ссылку: как вы делитесь кодом между проектами / решениями в Visual Studio? и он предлагает несколько хороших советов, но оба предложения, кажется, держат воду. Я хочу лучше понять последствия каждого из них и понять, какой выбор является правильным для моих нужд.

Я считаю, что со связыванием файлов я бы создал еще один новый Repository проект в Приложении-2, но используйте связанные файлы для того, что включает этот новый слой.

Я верю с добавлением Repository из Приложения-1 в качестве ссылки на Приложение-2 будет работать, но я не уверен, какое влияние окажет изменение кода.

Мне нужно знать, какой метод даст правильный результат, так как мне нужно разделить уровень хранилища среди приложений 1..n?

1 ответ

Решение

Если у вас есть реализация Repository/UnitOfWork, которой вы хотите поделиться в нескольких автономных проектах, у вас есть следующие варианты:

  1. Поместите исходные файлы *.cs в какую-то общую папку и добавьте эти файлы в виде ссылок в каждый проект.

    Плюсы:

    • Все исправления ошибок / функции автоматически попадают во все проекты.
    • Вы можете отладить свой код репозитория.
    • Поскольку код совместно используется как набор файлов, каждое решение может иметь свой собственный проект доступа к данным, который может расширять базовый код общего хранилища.


    Минусы:

    • Один и тот же код дублируется в обоих скомпилированных проектах, и если в какой-то момент проект1 будет запущен в зависимости от проекта2, возникнет конфликт между именем класса / пространством имен, который вам придется разрешить вручную (см. Комментарий Тома Блоджетта ниже).
    • Изменения кода в разделяемом классе должны выполняться осторожно, чтобы не нарушать существующую функциональность (например, удаление метода репозитория, который уже используется в каком-то другом проекте).
    • Если общий код связан с несколькими библиотеками, это в основном то же самое, что копировать его.


  2. Извлеките общий код в библиотеку классов, включите скомпилированную сборку.dll в качестве ссылки в оба проекта.

    Плюсы:

    • Предотвращает неожиданные изменения контракта.
    • Возможно иметь единую версию реализации репозитория - зарегистрированную в GAC
    • Можно полностью скрыть детали реализации (сделать репозиторий внутренним / запечатанным) и выставить только интерфейсы.
    • Библиотека классов действует как черный ящик, заставляя вас реализовывать лучшие контрактные интерфейсы /API.


    Минусы:

    • Потенциальная необходимость поддержки нескольких версий сборки, например, когда для project1 нужны новые функции из v2.0 библиотеки, а v2.0 содержат критические изменения, препятствующие его использованию в project2.


  3. Извлечь в отдельную библиотеку классов и включить библиотеку в качестве ссылки на проект

    Плюсы:

    • То же, что и в варианте 1, за исключением того, что код репозитория инкапсулирован в одну общую библиотеку и развернут как законченное решение. Расширение может привести к серьезным изменениям.


    Минусы:

    • Уменьшен контроль над изменениями, как в варианте 1 - изменение исходного кода в библиотеке может привести к возможным критическим изменениям в других проектах.

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

Другие вопросы по тегам