Разница между связыванием файлов и добавлением другого проекта в качестве ссылки?
У меня есть ситуация, когда у меня есть функциональность, которую я хочу использовать в более чем 1 приложении. В частности, у меня есть Repository
в форме библиотеки классов C#, содержащей такие вещи, как EF .edmx, репозиторий и UnitOfWork, которые достаточно универсальны для использования в разных приложениях.
Я разочарован тем, что не могу видеть картину более четко, потому что я должен четко понимать различия; и я делаю в точку. Однако я думаю, что не могу понять последствия каждого выбора и общие различия.
Я прочитал эту ссылку: как вы делитесь кодом между проектами / решениями в Visual Studio? и он предлагает несколько хороших советов, но оба предложения, кажется, держат воду. Я хочу лучше понять последствия каждого из них и понять, какой выбор является правильным для моих нужд.
Я считаю, что со связыванием файлов я бы создал еще один новый Repository
проект в Приложении-2, но используйте связанные файлы для того, что включает этот новый слой.
Я верю с добавлением Repository
из Приложения-1 в качестве ссылки на Приложение-2 будет работать, но я не уверен, какое влияние окажет изменение кода.
Мне нужно знать, какой метод даст правильный результат, так как мне нужно разделить уровень хранилища среди приложений 1..n?
1 ответ
Если у вас есть реализация Repository/UnitOfWork, которой вы хотите поделиться в нескольких автономных проектах, у вас есть следующие варианты:
Поместите исходные файлы *.cs в какую-то общую папку и добавьте эти файлы в виде ссылок в каждый проект.
Плюсы:
- Все исправления ошибок / функции автоматически попадают во все проекты.
- Вы можете отладить свой код репозитория.
- Поскольку код совместно используется как набор файлов, каждое решение может иметь свой собственный проект доступа к данным, который может расширять базовый код общего хранилища.
Минусы:- Один и тот же код дублируется в обоих скомпилированных проектах, и если в какой-то момент проект1 будет запущен в зависимости от проекта2, возникнет конфликт между именем класса / пространством имен, который вам придется разрешить вручную (см. Комментарий Тома Блоджетта ниже).
- Изменения кода в разделяемом классе должны выполняться осторожно, чтобы не нарушать существующую функциональность (например, удаление метода репозитория, который уже используется в каком-то другом проекте).
- Если общий код связан с несколькими библиотеками, это в основном то же самое, что копировать его.
Извлеките общий код в библиотеку классов, включите скомпилированную сборку.dll в качестве ссылки в оба проекта.
Плюсы:
- Предотвращает неожиданные изменения контракта.
- Возможно иметь единую версию реализации репозитория - зарегистрированную в GAC
- Можно полностью скрыть детали реализации (сделать репозиторий внутренним / запечатанным) и выставить только интерфейсы.
- Библиотека классов действует как черный ящик, заставляя вас реализовывать лучшие контрактные интерфейсы /API.
Минусы:- Потенциальная необходимость поддержки нескольких версий сборки, например, когда для project1 нужны новые функции из v2.0 библиотеки, а v2.0 содержат критические изменения, препятствующие его использованию в project2.
Извлечь в отдельную библиотеку классов и включить библиотеку в качестве ссылки на проект
Плюсы:
- То же, что и в варианте 1, за исключением того, что код репозитория инкапсулирован в одну общую библиотеку и развернут как законченное решение. Расширение может привести к серьезным изменениям.
Минусы:- Уменьшен контроль над изменениями, как в варианте 1 - изменение исходного кода в библиотеке может привести к возможным критическим изменениям в других проектах.
Но опять же, все зависит от многих факторов - какой тип управления версиями вы используете, каков будет жизненный цикл ваших проектов, есть ли несколько команд, разрабатывающих эти проекты, как эти проекты будут развернуты и будут ли они связаны. Все это влияет на окончательное решение.