2012-01-16 5 views
1

Я изо всех сил старался сделать это таким образом, чтобы удовлетворить все мои требования.Что такое легко поддерживаемый способ совместного использования общей библиотеки классов .net во многих корпоративных веб-приложениях asp.net mvc 3?

Вот что мы имеем в нашей библиотеке:

  • Базовые классы для контроллеров и услуг
  • бизнес-объектов (магазинов, отделов и т.д.)
  • Общие Частичные Views (Вход, ошибка, и т.д.)
  • Базовый класс для HttpApplication
  • Общие общего кода (читать файл INI, создать БД соед и т.д.)

Единственное требование, которое давал мне проблемы заключается в следующем:

  • живет в одном месте на сервере. (Т.е. скопировать локальный = ложь)

Это ломает, потому что:

  • DLL, содержащую класс HttpApplication должен находиться в том же каталоге, что и веб-приложения DLL для запуска. Я не нашел пути вокруг этого. Я в порядке с дублированием этого кода в каждом приложении, но скорее не буду.
  • Общие представления не любят работать, если я использую Assembly.LoadFrom() для загрузки DLL из общего местоположения. (Я использовал this method, чтобы прекомпилировать мои просмотры)
  • Любые ярлыки пространства имен в web.config прерываются во время выполнения с ошибками компиляции, потому что web.config анализируется перед загрузкой сборки.

Мой вопрос к вам, как вы справляетесь с своим общим кодом в аналогичной среде?

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

Кроме того, в качестве бонуса, если вы можете решить любую из проблем выше, это тоже было бы здорово.

Спасибо!

Редактировать: Я предполагаю, что следующий вопрос заключается в том, есть ли у нас даже каталог с общими dll (-ами) на сервере или если они должны быть развернуты только при развертывании/обновлении проектов?

+1

Посмотрите здесь http://stackoverflow.com/questions/1235253/how-is-an-assembly-resolved-in-net. Вы можете добавить свои собственные материалы, чтобы найти сборки. Слишком много в одной DLL, чтобы мой образ мышления ... –

+0

Я собираюсь поставить это как комментарий, а не ответ, потому что я действительно не рекомендую его, но я _suppose_ (при условии, что у вас есть соответствующий доступ на вашем сервере (серверах)), вы можете поместить соединения в свою папку «bin» для обычных DLL в одном центральном месте. Затем вы просто бросаете новую DLL в одно центральное место, на которое указывают все соединения. Я не уверен, что мне нравится идея этого вообще. – rejj

+0

Это звучит грубо, а переходы не всегда используются очень часто, не так ли? Вы предлагаете это, по существу, обмануть .net, чтобы думать, что все библиотеки находятся в одном каталоге? – IronicMuffin

ответ

1

Во-первых, вы захотите выделить то, что вы пытаетесь достичь. Не создавайте 1 библиотеку, которая делает все или у вас будет Big Ball of Mud. Не бойтесь создавать несколько поддерживаемых библиотек для достижения того, что вам нужно. Есть ли конкретная причина, по которой он должен храниться в одном месте?

Например, несколько предметов, которые вы упоминаете, являются MVC или веб-сайтом. Если у вас есть элементы, которые можно повторно использовать MVC, создайте библиотеку классов, которая содержит базовые классы MVC, которые вы наследуете, и ссылайтесь на них в своем проекте. По возможности используйте принцип единой ответственности.

Что касается других предметов, которые вы упомянули, например, для подключения к базе данных, если они многоразовые, отвлеките их в библиотеке классов доступа к данным и обратитесь к ней. Другие простые операции, такие как чтение ini-файла или создание файла, создание другой библиотеки и абстрактное ее использование в простых методах.

Я предпочитаю копировать библиотечные библиотеки DLL локально. Вы никогда не знаете, когда вам нужно будет внести изменения в библиотеку, но вы не хотите, чтобы все ваши проекты прекратили компиляцию. Когда вы будете готовы внедрить новую версию библиотеки, скопируйте DLL и перекомпилируйте ее.

+0

Цель одного местоположения состояла в том, чтобы мы могли удалить один файл, и каждый получит обновление. Я полагал, что это больше связано с DLL Hell, когда у этих 3 проектов есть одна версия, у этих 2 есть последняя, ​​и у этих 5 есть еще более старая версия и т. Д. – IronicMuffin

0

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