Подтвердить что ты не робот

Как работает архитектура Composite C1?

Может ли кто-нибудь дать подробное описание того, что происходит в ядре Composite C1? В частности, мне интересно узнать, как работает архитектура плагина, и каковы основные компоненты системы, то есть когда приходит запрос о том, что происходит в архитектуре. Описание не должно быть слишком подробным, просто список шагов и соответствующих классов.

Надеюсь, одна из основных разработчиков проекта просветит меня... и, возможно, опубликует еще несколько API (подсказка подскажите, пожалуйста, больше документации по классам).

4b9b3361

Ответ 1

От запроса к отображаемой странице

Конкретный путь, который принимает запрос, зависит от версии C1, которую вы используете, поскольку она была изменена на использование маршрутизации в версии 2.1.2. Поэтому давайте посмотрим

  • < 2.1.2

Composite.Core.WebClient.Renderings.RequestInterceptorHttpModule перехватит все входящие запросы и выяснит, соответствует ли запрошенный путь действительной странице C1. Если это так, URL будет переписан на обработчик страницы C1 ~/Rendererings/Page.aspx

  • 2.1.1

Composite.Core.Routing.Routes.Register() добавляет маршрут страницы C1 (Composite.Core.Routing.Pages.C1PageRoute) в коллекцию маршрутов, которая смотрит на входящий путь, показывает, имеет ли она действительную страницу C1. Если это так, он возвращает экземпляр ~/Rendererings/Page.aspx, готовый к выполнению.

Итак, теперь у нас есть экземпляр IHttpHandler, готовый составить страницу, которая будет возвращена клиенту. Фактический код для IHttpHandler легко увидеть, так как он находится в ~/Renderers/Page.aspx.cs.

  • OnPreInit

Здесь мы выясняем, какой идентификатор страницы и какой язык был запрошен, и посмотрим, находимся ли мы в режиме предварительного просмотра или нет, какой datascope и т.д.

  • OnInit

Теперь мы извлекаем контент из каждого Хранилища контента на нашей странице и исключаем его функции, которые могут содержать. Это делается путем вызова Composite.Core.WebClient.Renderings.Page.PageRenderer.Render передачи текущей страницы и наших заполнителей. Внутри он вызывается методом ExecuteFunctions, который будет проходить через контент и рекурсивно разрешать C1 функциональные элементы (<f:function />), выполнять их и заменять элемент выходными функциями. Это будет сделано до тех пор, пока в содержимом не будет больше функциональных элементов, в том случае, если функции сами выдают другие функции.

Теперь весь контент завернут в элемент управления Asp.Net WebForms и вставлен на нашу страницу WebForms. Поскольку функции C1 могут возвращать элементы управления WebForms, такие как UserControl и т.д., Это необходимо для правильной работы и запуска жизненного цикла событий WebForms.

И, что в основном это. Оказание запрашиваемой страницы очень просто и очень расширяемо. Например, есть расширение, которое позволяет использовать MasterPages, который просто втягивается в этот поток рендеринга очень элегантно. И поскольку мы используем Routing для сопоставления используемого обработчика, его также можно забыть о ~/Rendering/Page.aspx и просто вернуть MvcHandler, если ваш фанатик Mvc.

API

Теперь, когда дело доходит до более основного API, их много, в зависимости от того, что вы хотите сделать. Но вы можете быть уверены, независимо от того, какие из них необходимы, чтобы выполнить работу.

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

Основная группа Composite C1 еще не проверила/рефакторировала и документировала весь API в системе и, следовательно, работала с концепцией "публичного API" и тем, что может стать API, когда спрос существует. Последний - довольно устойчивый API, но без гарантий.

Публичная документация API находится в режиме онлайн http://api.composite.net/

Функции

Функции являются фундаментальной частью C1 и являются методом абстрагирования логики от исполнения. В основном все, что либо выполняет действие, либо возвращает некоторые данные/строку/значения, может быть кандидатом на функции. На самом низком уровне функция является классом .Net, реализующим интерфейс IFunction, но, к счастью, существует много более простых способов работы с ним. Из коробки C1 поддерживает функции, определенные как XSLT-шаблоны, методы С# или Sql. Существует также поддержка сообщества для написания функций с использованием Razor или наличия функций ASP.Net UserControls (.ascx).

Так как все функции зарегистрированы в C1 во время запуска системы, мы используем Composite.Functions.FunctionFacade для выполнения любой функции, которую знаем имя. Используйте GetFunction, чтобы получить ссылку на функцию, а затем Execute выполнить ее и получить возвращаемое значение. Функции могут принимать параметры, которые передаются как реальные .Net-объекты при выполнении функции. Существует также полная поддержка вызова функций с помощью разметки Xml с использованием элемента <f:function />, что означает, что редакторы, дизайнеры, производители шаблонов и т.д. Легко могут получить доступ к множеству функциональных возможностей, не зная, как писать код .Net.

Подробнее о функциях здесь http://users.composite.net/C1/Functions.aspxи как использовать ie Razor для создания функций здесь http://docs.composite.net/C1/ASP-NET/Razor-Functions.aspx

Глобализация и локализация

C1 имеет полную поддержку нескольких языков в ядре. Composite.Core.Localization.LocalizationFacade используется для управления установленными локалями в системе; запрос, добавление и удаление. Локали могут быть любыми CultureInfo объектами, известными вашей системе.

Composite.Core.ResourceSystem.StringResourceSystemFacade используется для получения строк во время выполнения, которое соответствует CultureInfo, в котором выполняется ваш запрос. Используйте это вместо строк жесткого кодирования на ваших страницах или в ваших шаблонах.

Подробнее о локализации здесь http://docs.composite.net/C1/HTML/C1-Localization.aspx

Глобальные события

Composite.C1Console.Events.GlobalEventSystemFacade важно знать, нужно ли отслеживать, когда система отключается, поэтому вы можете вносить изменения в последнюю минуту. Поскольку C1 является многопоточным, его легко записываемые расширения и модули для C1, которые также имеют многопоточность, используя многоядерные системы и распараллеливание, и поэтому он также имеет решающее значение для надлежащего закрытия потоков. GlobalEventSystemFacade поможет вам в этом.

События при запуске Если вы пишете плагины, у них может быть пользовательский factory. Другой код может использовать атрибут ApplicationStartupAttribute для вызова вызываемого ядра Composite C1 при запуске веб-приложения.

События данных Вы можете подписаться на данные, добавлять, редактировать и удалять события (pre и post) с использованием статических методов на Composite.Data.DataEvents<T>. Чтобы подключиться к этим событиям при запуске системы, используйте атрибут ApplicationStartupAttribute.

Данные

Composite.Core.Threading.ThreadDataManager важно, если вы обращаетесь к Уровню данных за пределами соответствующего запроса на страницу C1. Это может быть пользовательский обработчик, который просто должен передавать все новейшие новости в виде Rss-канала или, возможно, писать консольное приложение. В этих случаях всегда помните, чтобы обернуть свой код, который обращается к данным, подобным этому

using(Composite.Core.Threading.ThreadDataManager.EnsureInitialize())
{
  // Code that works with C1 data layer goes here
}

Для доступа к данным и управления ими рекомендуется НЕ использовать класс DataFacade, но обернуть весь код, который получает или обновляет или удаляет или добавляет данные, подобные этому

using(var data = new DataConnection())
{
   // Do things with data
}

IO

При работе с файлами и каталогами важно использовать C1-эквивалентные классы Composite.Core.IO.C1File и Composite.Core.IO.C1Directory для .Net файла и каталога. Это связано с тем, что C1 может размещаться на Azure, где у вас может не быть доступа к файловой системе так же, как у вас есть обычный Windows Server. Используя оболочки C1 File и Directory, вы можете быть уверены, что код, который вы пишете, сможет работать и на Azure.

Консоль C1

Консоль - это целая тема сама по себе и имеет много API.

Вы можете создать свои собственные деревья с помощью Composite.C1Console.Trees.TreeFacade или Composite.C1Console.Elements.ElementFacade и реализовать Composite.C1Console.Elements.Plugins.ElementProvider.IElementProvider.

Вы можете использовать Composite.C1Console.Events.ConsoleMessageQueueFacade для отправки сообщений с сервера клиенту, чтобы он делал такие вещи, как открывать окно сообщения, обновлять дерево, устанавливать фокус на определенный элемент, открывать новую вкладку и т.д. и т.д.

Composite.C1Console.Workflow.WorkflowFacade используется для получения экземпляров конкретных рабочих процессов и взаимодействия с ними. Workflows является очень фундаментальной частью C1 и является способом определения и выполнения многошаговых операций. Это позволяет сохранить состояние работы, т.е. мастер с 10 шагами сохраняется, даже если сервер перезагружается или что-то еще происходит неожиданно. Workflows создаются с использованием Windows Workflow Foundation, так что вы знакомы с этим, вы должны чувствовать себя как дома

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

composite.config

Основная часть C1 - это провайдеры, почти все состоит из провайдеров, даже большая часть основных функций. Все в консоли от Perspectives to Trees, а также элементы и действия подаются в C1 с поставщиками. Все стандартные функции, datalayer и все виджеты для использования с редактором Function Call передаются в C1 с поставщиками. Все строки локализации для использования с Ресурсами, пользователями и разрешениями, составителями URL и т.д. Являются всеми поставщиками.

  • Composite.Data.Plugins.DataProviderConfiguration

Здесь регистрируются все провайдеры, которые могут отвечать на методы DataFacade, Get, Update, Delete, Add и т.д. Каждый провайдер информирует систему, с которой он может взаимодействовать, и C1 обеспечивает маршрутизацию всех запросов для определенных интерфейсов к их соответствующим датапараузерам.

  • Composite.C1Console.Elements.Plugins.ElementProviderConfiguration

Здесь мы определяем перспективы и деревья внутри Консоли. Все стандартные перспективы, которые вы видите при запуске Консоли в первый раз, настроены здесь, не задействованы магические или черные ящики.

  • Composite.C1Console.Elements.Plugins.ElementActionProviderConfiguration

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

  • Composite.C1Console.Security.Plugins.LoginProviderConfiguration

LoginProvider - это то, что консоль C1 будет использовать для аутентификации пользователя и позволит вам войти в систему или нет. К сожалению, это не очень просто, но с некоторым отражением вы должны быть настроены.

  • Composite.Functions.Plugins.FunctionProviderConfiguration

Composite C1 будет использовать все зарегистрированные FunctionProviders для заполнения внутреннего списка функций при запуске системы.

  • Composite.Functions.Plugins.WidgetFunctionProviderConfiguration

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

  • Composite.Functions.Plugins.XslExtensionsProviderConfiguration

Пользовательские расширения для использования в шаблонах XSLT регистрируются здесь

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

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

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

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

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

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

Слайды

Некоторые слайды обзора можно найти на этих линзах

Вдохновение и примеры

C1Contribпроект на GitHub - очень хорошее введение, как взаимодействовать с различными частями C1. Его коллекция небольших пакетов, которые можно использовать как есть, или для вдохновения. Существуют пакеты, которые манипулируют динамическими типами, чтобы обеспечить наследование интерфейса. Другие пакеты используют javascript api в консоли, в то время как другие показывают, как создавать функции-провайдеры, деревья и привязывать команды к существующим элементам. Есть даже примеры того, как манипулировать с помощью взаимодействия с веб-сайтом Soap между клиентом и сервером, чтобы вы могли сделать так, как хотите. И этот список продолжается.