Методы составления конфигурации для составных приложений (например, PRISM, MEF) - PullRequest
14 голосов
/ 01 апреля 2011

Фреймворки, такие как PRISM и MEF, позволяют очень просто создавать сложные приложения из нескольких компонуемых компонентов. Одним из распространенных примеров этого является архитектура подключаемого модуля, в которой оболочка приложения может быть переконфигурирована с помощью подключаемых компонентов пользовательского интерфейса (например, путем перетаскивания библиотек DLL в каталог Plug-ins).

Это все хорошо, но, как Vaccano обнаружен в Может ли Prism быть модульной при вызове веб-сервисов? существуют обстоятельства, когда каждый отдельный плагин требует своего собственного набора конфигурации - типичные привязки WCF например, но есть много других сценариев (ведение журнала, соединения с базой данных и т. д.) с аналогичными потребностями.

Итак, на мой взгляд, у нас есть следующие варианты:

  • Вся конфигурация входит в App.config приложения оболочки (которое, как упомянул Vaccano, нарушает все преимущества данной модели в инкапсуляции и развертывании), или
  • Каждая сборка подключаемого модуля использует специальный механизм для конфигурации (например, встроенный ресурс), а затем использует его для динамической настройки, например, службы WCF (которая в лучшем случае является грязной и требует много времени, а в худшем случае может оказаться невозможной). )

Ни один из этих вариантов не идеален, но они являются обходными путями. Однако в идеальном случае каждая подключаемая DLL-библиотека должна иметь либо самодостаточную конфигурацию (например, файл встроенного ресурса), либо файл Xxx.dll.config, и каждый из этих фрагментов конфигурации XML объединяется в конфигурацию App.config приложение оболочки динамически во время выполнения. Это напоминает способ объединения файлов Machine.config и App.config.

Поэтому мой вопрос: кто-нибудь сталкивался с какими-либо существующими средами или методами, которые можно было бы использовать, чтобы разрешить это динамическое объединение составных конфигурационных файлов в рабочую конфигурацию приложения-контейнера? Я удивлен, что не воспринимаю это как часть PRISM или MEF, и поэтому немного осторожен с тем, чтобы публиковать этот вопрос на случай, если я что-то упустил очевидное - если это так, пожалуйста, просто оставьте соответствующую ссылку:

Ответы [ 3 ]

4 голосов
/ 01 апреля 2011

Мы столкнулись с той же проблемой. Я тоже не нашел решения этой проблемы.

Вот две вещи, которые я видел, что люди делают (или мы сделали):

Регистрация конечной точки обслуживания вручную

Создайте реестр службы приложений, в котором говорится, как создать ChannelFactory из T. Каждый модуль может внести свой вклад в это в IModule Initialize, вызвав RegisterService<T>, и все подчиненные представления этого модуля могут получить от него свои фабрики каналов:

public interface IServiceRegistry
{
     void RegisterService<T>(ServiceEndpoint ep);
     ChannelFactory<T> GetService<T>();
}

Вместо возврата ChannelFactory<T> здесь вы можете просто вернуть T, конечно (предостережение emptor). View / ViewModels просто запросят IServiceRegistry в качестве зависимости и таким образом получат свои прокси службы. Это также обеспечивает удобное место для изоляции при написании модульных тестов.

Встроенная конфигурация

Система соглашений примерно выполняет те же действия, что и выше, но основана на конфигурации, встроенной в DLL (как вы предложили), и использует именованные конфигурации. Вы потребляете это так же, как описано выше, но это будет немного другой опыт. Мы используем соглашение «Endpoints.config», встроенное в нашу DLL, и читаем из него.

public interface IServiceChannelFactoryFactory //I'm terrible at naming
{
    //This is much like the generated concrete class when you use "Add Service Reference"
    //Except there is no method with an empty parameter
    ChannelFactory<T> GetService<T>(string endpointName);
}

Наш файл «Endpoints.config» имеет несколько конечных точек на каждое имя конечной точки с добавленными атрибутами, которые делают эту конечную точку уникальной для среды (DEV, QA, Staging, Production). Я не знаю, беспокоит ли это вас, но это было удобное место для установки такого типа конфигурации.

Обе работы. Меня удивляет, что я не видел, чтобы больше людей говорили об этом. Отличный вопрос.

1 голос
/ 11 апреля 2011

В руководстве Composite Services *1001*, основанном на шаблонах и практиках (та же команда, которая представила вам Prism), представлены шаблоны проектирования и реализации для обнаружения, компоновки и интеграции служб.

Что касается слияния динамических конфигураций, взгляните на реализацию сложных сценариев конфигурации , которые есть в Enterprise Library 5.0. Он не является общим и ориентирован только на конфигурацию Enterprise Library, но вы все еще можете изучить исходный код.

0 голосов
/ 06 апреля 2011

Для приложений Windows / WPF вы можете достичь этого, создав провайдера пользовательских настроек - это класс, который вы создаете и подключаете к системе конфигурации.

Теоретически Вы можете поместить свои настройки в специфичные для модуля конфигурационные файлы. Вы должны создать поставщика настроек, который знает, как искать эти специфичные для модуля файлы во время выполнения, и предоставляет настройки. Так как это находится «под» потребителями конфигурации в стеке, WCF или другая технология не должны знать ничего особенного для ее использования. Единственным недостатком является то, что он не поддерживается в Silverlight.

Вот ссылка на статью проекта кода, где он реализован: http://www.codeproject.com/KB/vb/CustomSettingsProvider.aspx

Вот ссылка на документацию MSDN: http://msdn.microsoft.com/en-us/library/system.configuration.settingsprovider.aspx

...