MEF для меня? (одно базовое приложение, позволяющее подключать к нему клиентские приложения) - PullRequest
1 голос
/ 07 июля 2010

Я пытаюсь определить, является ли MEF правильным направлением, в котором должна следовать наша прикладная среда. Из моего прочтения MEF наша структура, похоже, «не совсем» подходит, но я посмотрю, смогут ли мне помочь какие-то эксперты.

Наша структура позволяет нам иметь один основной веб-сайт и развернутые зависимые сборки в одном месте (и исправления или функции распространяются на всех клиентов), затем у нас есть клиентские веб-сайты, которые как бы «объединяются» с основным веб-сайтом и расширяют его, необходимо.

Теперь в IIS каждый клиентский сайт - это свое собственное приложение, работающее в своем собственном домене приложений. Однако каждое приложение имеет один и тот же физический путь, указывающий на «основной веб-сайт».

Итак, наша файловая структура ...

  • / CoreSite
    • / bin (содержит базовый сайт и библиотеки зависимостей)
    • / [Основные папки сайта] (например, Модели, Представления, Контроллеры, Контент и т. Д.)
    • / Клиенты
      • / _ Сборки (содержащие все клиентские сборки - 100 клиентов)
      • / Client1
        • / [Папки сайта клиента] (например, модели, представления, контроллеры и т. Д.)
      • / Client2
        • / [Папки сайта клиента] (например, модели, представления, контроллеры и т. Д.)
      • / ClientN
    1036 **

Так что, как вы уже догадались, загрузка сборки - это наша проблема. Мы не хотели помещать все клиентские сборки в папку root / bin по нескольким причинам. Сначала мы не хотели, чтобы каждый клиентский сайт загружал все остальные клиентские сборки. Во-вторых, мы не хотели, чтобы домен каждого сайта перерабатывался просто потому, что в папке / bin была обновлена ​​сборка другого клиента.

Чтобы сделать это в asp.net 1.1, мы следовали http://www.hanselman.com/blog/MovingTheCodeBehindAssembliesDLLsToADifferentFolderThanBINWithASPNET11.aspx и добавили элемент в web.config вместе с <% @ Assembly Директива Name = "ClientN"%> в каждом представлении на клиентских сайтах. Единственная другая проблема, с которой нам пришлось столкнуться, это обновление клиентских сборок, но asp.net 1.1 блокировал сборки в каталоге / Clients / _Assemblies. Мы просто добавили:

if ( Directory.Exists( assembliesDir ) && AppDomain.CurrentDomain.SetupInformation.ShadowCopyDirectories.IndexOf( assembliesDir ) < 0 )
{
    AppDomain.CurrentDomain.SetShadowCopyPath( AppDomain.CurrentDomain.SetupInformation.ShadowCopyDirectories + ";" + assembliesDir );
}

И альт, все, казалось, работало как шарм. К сожалению, в asp.net 4.0 AppDomain.CurrentDomain.SetShadowCopyPath () устарела. Таким образом, мы возились с попыткой загрузить сборки из байтового массива, пытались использовать событие AssemblyResolve, безрезультатно пытались использовать [Assembly: PreApplicationStartMethod (typeof (MvcApplication), «PreApplicationStart»)]]. Compilation.BuildManager.AddReferencedAssembly безрезультатно.

Мы либо получаем: - сборка не загружена - загружено слишком много сборок, или - сборка загружается, но когда представление рендерится и встречает директиву , где пространство имен должно быть расположено из <% @ Assembly Name = "ClientN"%>, просто происходит сбой.

Поэтому я прошу любые предложения, использующие любой механизм и / или советы о том, является ли MEF подходящим вариантом. Мой взгляд на 1000 футов заключается в том, что MEF больше ориентирован на 1 приложение (или веб-сайт), в которое включены несколько компонентов. Я не решаюсь начать основной рефакторинг кода (кажется), потому что в нашей ситуации у нас когда-либо есть только один компонент, подключаемый к нему за раз на приложение / домен приложения. Похоже, что он делает гораздо больше, чем нам нужно (просто загрузите сборку и убедитесь, что asp.net распознает ее ... тогда весь наш код будет работать).

Любой совет с благодарностью.

Ответы [ 2 ]

0 голосов
/ 15 июля 2011

Согласно документации, поведение изменилось с .NET 2.0.Все сборки, найденные путем зондирования (включая закрытый путь), автоматически подвергаются теневому копированию (потому что он включен для домена приложения), а метод SetShadowCopyPath имеет обратную цель - он сужает путь теневого копирования.

По умолчанию теневая копия включает в себя все сборки, найденные при зондировании.Метод SetShadowCopyPath ограничивает теневую копию сборками в каталогах, указанных в path .

Метод SetShadowCopyPath не указывает дополнительные каталоги, в которых нужно искать сборки.Сборки для теневого копирования уже должны быть расположены в пути поиска, например, в BaseDirectory .Метод SetShadowCopyPath указывает, какие пути поиска могут быть скопированы тенями.

0 голосов
/ 08 июля 2010

Похоже, что вам нужно сделать, это выяснить, как включить теневое копирование для всех папок, в которых у вас есть сборки. Причина, по которой используемый вами метод устарел, заключается в том, что вам действительно нужно установить это до того, как AppDomain будетсоздано.Поэтому я предполагаю, что, вероятно, вам нужно что-то настроить в своем файле web.config, чтобы включить это.

MEF может подходить или не подходить для вашего приложения, но это не решит проблему теневого копирования.

...