четверг, 12 апреля 2012 г.

Как работает архитектура в Composite C1 CMS (3)

Третья заключительная часть перевода статьи на StackOverflow, посвященной архитектуре Composite C1:  How does the architecture work? (Ссылки на англоязычные ресурсы в статье сохранены с небольшой коррекцией.)

Читать первую часть и вторую часть перевода.


composite.config

Фундаментальной частью C1 являются поставщики (providers), почти все состоит из поставщиков, даже большая часть функциональности ядра системы. Все в админке, начиная с разделов (perspectives) и деревьев и заканчивая элементами и действиями, поставляется в C1 поставщиками. Все стандартные функции, уровень данных и все виджеты, используемые в редакторе вызовов функций поставляются в C1 поставщиками. Все строки локализации, используемые ресурсами, пользователи и разрешения, форматировщики URL-адресов и т.п. - все это поставщики.


  • Composite.Data.Plugins.DataProviderConfiguration
Здесь все поставщики, которые могут отвечать методам в DataFacade ("получить", "обновить", "удалить", "добавить" и т.п.) регистрируются. Каждый поставщик информирует систему о том, с какими интерфейсами он может взаимодействовать, а C1 обеспечивает маршрутизацию всех запросов конкретных интерфейсов к своим соответствующим поставщикам данных.
  • Composite.C1Console.Elements.Plugins.ElementProviderConfiguration
Здесь мы определяем разделы и деревья внутри админки. Все стандартные разделы, которые вы видите, запуская админ. консоль в первый раз, сконфигурированы здесь, и никакого волшебства или "черных ящиков".
  • Composite.C1Console.Elements.Plugins.ElementActionProviderConfiguration
Поставщики действий (action providers) умеют добавлять новые пункты меню ко всем элементам в системе, на основе своих "маркеров сущностей" (EntityToken). Это очень мощный инструмент, когда вам нужно добавить новую функциональность к существующему контенту, как например, контроль версий, безопасность в экстранете, несистемные операции "вырезать/вставить" -  список можно продолжать.
  • Composite.C1Console.Security.Plugins.LoginProviderConfiguration
Поставщик входа в систему LoginProvider - это то, что админка в C1 будет использовать для проверки подлинности пользователя и разрешения или запрета входа в систему. К сожалению, он не очень открыт, но используя "отражение" (reflection),  вы будете во всеоружии.
  • Composite.Functions.Plugins.FunctionProviderConfiguration
Composite C1 будет использовать все зарегистрированные поставщики функций FunctionProviders для заполнения внутреннего списка функций при запуске системы.
  • Composite.Functions.Plugins.WidgetFunctionProviderConfiguration
Поставщики виджетов WidgetProviders используются, например, в редакторе вызовов функций или в XML-коде форм для обработки и отображения настраиваемого интерфейса пользователя для выбора данных.
  • Composite.Functions.Plugins.XslExtensionsProviderConfiguration
Пользовательские расширения, используемые в шаблонах XSLT регистрируются здесь.

Далее у нас идут несколько разделов чисто для конфигурации, например, кэширования или того, что подлежит параллелизации, но это не так интересно, как тема поставщиков.

Определение и использование разделов

Разделы в composite.config и других связанных config-файлах - целиком и полностью являются стандартной .NET-конфигурацией и подчиняются ее правилам. Это означает, что для того, чтобы воспользоваться произвольным элементом, как, например, Composite.Functions.Plugins.WidgetFunctionProviderConfiguration, его нужно определить как раздел. У раздела есть название и он ссылается на тип, который наследуется от System.Configuration.ConfigurationSection. Composite C1 использует библиотеки Microsoft Enterprise Libraries для работы с большей частью этих объектов, таких как конфигурация, журналирование и проверка данных; соотвественно, все разделы Composite C1 наследуются от Microsoft.Practices.EnterpriseLibrary.Common.Configuration.SerializableConfigurationSection. Итак, такому типу нужно иметь свойства для всех элементов, которые нам нужно определять в config-файле, а .NET автоматически обеспечит нужные для нас связи.

Если вам нужен доступ к конфигурации конкретного раздела, вам следует вызвать Composite.Core.Configuration.ConfigurationServices.ConfigurationSource.GetSection(".. имя раздела") и привести его к вашему конкретному типу, и тогда у вас все готово.

Добавление дополнительных свойств к уже определенным разделам

Обычно .NET будет "жаловаться", если вы запишите элементы или атрибуты в config-файле, которые не узнаются типом, ответственным за это раздел или элемент. Из-за этого трудно написать действительно гибкую модульную систему, в которой сторонние авторы смогут добавлять конкретные конфигурационные опции к своим поставщикам, таким образом мы приходим к понятию ассемблера (Assembler). Это класс ConfigurationElement с атрибутом Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder.AssemblerAttribute, который в свою очередь принимает интерфейс Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder.IAssembler в качестве аргумента, ответственного за получение таких произвольных атрибутов и значений из элемента в config-файле, и генерирует на его основе используемый объект. Благодаря этому .NET не будет "жаловаться" на недопустимый config-файл, так как мы вставляем объект ConfigurationElement, у которого есть свойства для всех наших произвольных атрибутов, и мы можем получить к ним доступ при чтении конфигурации через IAssembler.

Слайды

Обзоры в виде слайдов можно посмотреть по этим ссылкам (все на англ.):

В качестве примеров

Проект C1Contrib на CodePlex является хорошим введением в тему о  взаимодействии с различными частями C1. Это коллекция небольших пакетов расширения, которые можно использовать "как есть", или брать в качестве примеров для своих проектов. Некоторые пакеты манипулируют динамическими типами, чтобы сделать возможным наследование интерфейсов. В других пакетах используются программные JavaScript-интерфейсы в админке, а еще в одних демонстрируется  создание поставщиков функций, деревьев, и подключение команд к существующим элементам. Есть даже примеры манипулирования через SOAP веб-службу процессом общения между клиентом и сервером, чтобы делать все именно так, как вам нужно. И список можно продолжать.

***

Ссылки по теме на некоторые материалы на русском:

Комментариев нет:

Отправить комментарий