2013-04-17 1 views
1

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

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

Я прочел эту ссылку: How do you share code between projects/solutions in Visual Studio? и он предлагает несколько полезных советов, но оба предложения, похоже, содержат воду. Я хочу лучше понять последствия каждого из последующих действий каждого и понять, что является правильным выбором для моей потребности.

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

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

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

ответ

4

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

  1. PUT источник * .cs файлы в некоторой общей папке, и добавить эти файлы как ссылки в каждого проекта.

    Pros:

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


    Против:

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


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

    Pros:

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


    Против:

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


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

    Pros:

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


    Против:

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

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

+1

Компиляция одного и того же файла класса в несколько сборок не создает конфликт (или, если хотите, не создает неразрешимый конфликт). Классы будут различными типами. Легко использовать VS и csc для борьбы с ними - просто используйте [extern aliases] (http://msdn.microsoft.com/en-us/library/ms173212 (v = vs.80) .aspx). Реальная проблема заключается в том, что они будут разными типами, и если вы хотите конвертировать между ними, вам придется писать методы преобразования типов. И если они подвергаются воздействию COM, COM не может различать их. –

+0

Спасибо, не знал, что это возможно. Я отредактировал свой ответ. – Alexander

+0

@Alexander - Как насчет ответвления варианта № 2, который: «Извлеките общий код в библиотеку классов и добавьте эту новую рефакторированную библиотеку классов как * существующий проект * в проект №2». Это в отличие от ссылки на DLL. Мне нравится мысль добавления ссылки на существующий проект, потому что я могу выполнить код в обоих проектах. Наличие .dll не позволяет мне это делать (без помощи некоторых инструментов для декомпиляции и вхождения). – atconway