20

任何人都可以对复合 C1 核心中发生的事情进行高级描述吗?特别是我有兴趣了解插件架构如何工作以及系统的核心组件是什么,即当请求到达时架构中发生了什么。描述不必过于冗长,只需列出步骤和所涉及的类即可。

希望核心开发团队之一能启发我......并且可能会发布更多 API(请提示更多类文档)。

4

1 回答 1

40

从请求到渲染页面

请求采用的具体路径取决于您使用的 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) 添加到 Routes-collection,查看传入路径,确定它是否是有效的 C1 页面。如果是,则返回一个~/Rendererings/Page.aspx准备执行的实例。

好的,现在我们有一个IHttpHandler准备好组成要返回给客户端的页面的实例。的实际代码IHttpHandler很容易看到,因为它位于~/Renderers/Page.aspx.cs.

  • OnPreInit

在这里,我们正在确定请求的页面 ID 和语言,并查看我们是否处于预览模式,哪个数据范围等。

  • 初始化

现在我们从页面的每个内容占位符中获取内容,并执行它可能包含的功能。它通过调用Composite.Core.WebClient.Renderings.Page.PageRenderer.Render传递当前页面和我们的占位符来完成。在内部,它将调用ExecuteFunctions将遍历内容并递归解析 C1 函数元素 ( <f:function />) 的方法,执行它们并用函数输出替换元素。这将一直持续到内容中不再有功能元素,以防功能自身输出其他功能。

现在整个内容都包装在一个 Asp.Net WebForms 控件中,并插入到我们的 WebForms 页面中。由于 C1 函数可以返回 WebForms 控件UserControl等,这是它们正常​​工作并触发 WebForms 的事件生命周期所必需的。

而且,基本上就是这样。请求页面的呈现非常简单且非常可扩展。例如,是否有一个扩展可以MasterPages非常优雅地简单地连接到这个渲染流程中。并且因为我们用于映射要使用的处理程序,所以如果您是 Mvc 狂热者Routing,也可以忘记~/Rendering/Page.aspx并返回 a 。MvcHandler

API

现在,当涉及到更核心的 API 时,有很多,这取决于您想要做什么。但是你可以很确定,不管有什么必要的东西来完成工作。

在最深处,我们有数据层,大多数其他 API 和外观都围绕着它。这意味着您可以使用原始数据做大部分事情,而不是一直通过门面。这是可能的,因为 C1 的大多数配置都是通过使用它自己的数据层来存储配置来完成的。

Composite C1 核心组尚未验证/重构和记录系统中的所有 API,因此使用“公共 API”的概念以及在有需求时可以成为 API 的概念进行操作。后者是一个非常稳定的 API,但没有保证。

公共 API 文档位于http://api.composite.net/

职能

函数是 C1 的基本部分,是一种从执行中抽象逻辑的技术。基本上所有执行操作或返回一些数据/字符串/值的东西都可以成为函数的候选者。在最低级别,函数是实现IFunction接口的 .Net 类,但幸运的是,有许多更简单的方法可以使用它。开箱即用C1 支持定义为 XSLT 模板、C# 方法或 Sql 的函数。还有社区支持使用 Razor 编写函数或将 ASP.Net 用户控件(.ascx 文件)作为函数。

由于在系统启动期间所有函数都在 C1 中注册,因此我们使用Composite.Functions.FunctionFacade来执行我们知道名称的任何函数。使用GetFunction获取对函数的引用,然后Execute执行它并获取返回值。函数可以在执行函数时接受作为真实 .Net 对象传递的参数。还完全支持使用<f:function />元素调用带有 Xml 标记的函数,这意味着编辑者、设计者、模板制作者等可以轻松访问丰富的功能,而无需知道如何编写 .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帮助您做到这一点。

启动事件 如果您编写插件,这些可以有一个自定义工厂。其他代码可以使用该ApplicationStartupAttribute属性在 Web 应用程序启动时被 Composite C1 核心调用。

数据事件 您可以使用 上的静态方法订阅数据添加、编辑和删除事件(前和后)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 的文件和目录包装器,您可以确保您编写的代码也能够在 Azure 上运行。

C1 控制台

控制台本身就是一个完整的主题,并且有许多 API。

您可以使用Composite.C1Console.Trees.TreeFacadeorComposite.C1Console.Elements.ElementFacade并实现Composite.C1Console.Elements.Plugins.ElementProvider.IElementProvider.

您可以使用Composite.C1Console.Events.ConsoleMessageQueueFacade将消息从服​​务器发送到客户端,使其执行诸如打开消息框、刷新树、将焦点设置在特定元素上、打开新选项卡等操作。

Composite.C1Console.Workflow.WorkflowFacade用于获取特定工作流的实例并与之交互。Workflows是 C1 的一个非常基本的部分,是定义和执行多步操作的方式。这使得可以保存操作状态,即。即使服务器重新启动或发生任何其他意外情况,也会保留 10 步向导。是使用Windows Workflow FoundationWorkflows构建的,所以你熟悉这个,你应该有宾至如归的感觉

在向控制台编写扩展时,您还可以使用大量的 javascript 外观和方法。比我在这里所能涵盖的要多得多,所以我什至不会在这里开始讨论这个主题。

复合配置

C1 的一个基本部分是提供者,几乎所有东西都由提供者组成,甚至包括大部分核心功能。控制台中从透视图到树以及元素和操作的所有内容都通过提供程序输入到 C1 中。与函数调用编辑器一起使用的所有标准函数、数据层和所有小部件都通过提供程序输入到 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 用于函数调用编辑器或表单标记等内容,以呈现自定义 UI 以选择数据。

  • Composite.Functions.Plugins.XslExtensionsProviderConfiguration

用于 XSLT 模板的自定义扩展在此处注册

然后我们有几个部分用于纯配置,例如缓存或要并行化的内容,但它不像提供程序那样有趣。

定义和使用部分

Composite.config 中的部分以及其他相关的 .config 文件是完全标准的 .Net 配置并遵守其规则。这意味着能够使用自定义元素,例如 ie。Composite.Functions.Plugins.WidgetFunctionProviderConfiguration它必须被定义为一个部分。一个部分有一个名称,并引用一个继承自 的类型System.Configuration.ConfigurationSection。Composite 使用 Microsoft 企业库来处理大多数常见的事情,例如配置、日志记录和验证,因此所有 Composites 部分都继承自Microsoft.Practices.EnterpriseLibrary.Common.Configuration.SerializableConfigurationSection. 现在,这种类型只需要具有我们希望能够在 .config 文件中定义的所有元素的属性,并且 .Net 会自动确保为我们连接起来。

如果您想访问特定部分的配置,您可以调用Composite.Core.Configuration.ConfigurationServices.ConfigurationSource.GetSection(".. section name")并将其转换为您的特定类型和您的好去处。

向已定义的部分添加额外的属性

通常,如果您在 .config 文件中编写的元素或属性不能被负责该部分或元素的类型识别,.Net 会抱怨。这使得很难编写一个真正灵活的模块系统,外部作者可以在其中向他们的提供者添加特定的配置选项,因此我们有了汇编程序的概念。它是一个 ConfigurationElement 类,具有Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder.AssemblerAttribute分配给它的属性,而该属性又需要一个Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder.IAssembler接口作为参数,负责从 .config 文件中的元素获取这些自定义属性和值,并从中发出可用对象。这样 .Net 不会抱怨无效的 .config 文件,因为我们注入了一个 ConfigurationElement 对象,该对象具有我们所有自定义属性的属性,并且我们可以在通过 IAssembler 读取配置时获取它们

幻灯片

可以在这些 lins 上找到一些概述幻灯片

灵感和例子

GitHub 上的C1Contrib项目很好地介绍了如何与 C1 的不同部分进行交互。它是一个小包装的集合,可以按原样使用,也可以用于灵感。有些包使用动态类型进行操作以启用接口继承。其他包在控制台中使用 javascript api,而其他包则展示了如何将函数提供程序、树和挂钩命令连接到现有元素。甚至还有一些示例说明如何使用客户端和服务器之间进行的 Soap Web 服务通信进行操作,以便您可以让它按照您想要的方式做事。而这样的例子不胜枚举。

于 2011-10-30T09:18:57.977 回答