Skip to Content

注册表系统

Entity Engine 使用多个专门的注册表来管理不同类型的组件。每个注册表负责特定功能:元数据注册表管理模型和视图,字段类型注册表管理数据类型,组件注册表管理UI组件,等等。

通过注册表系统,您可以动态扩展引擎的功能,注册自定义组件,并在运行时查找和使用这些组件。

使用元数据注册表

元数据注册表是最常用的注册表,负责管理所有的实体模型和视图定义。

注册模型

使用 updateOrRegister 方法向元数据注册表添加新的模型定义:

const engine = await getEntityEngine(); await engine.metaRegistry.updateOrRegister({ name: 'Product', title: '产品管理', fields: [ { name: 'id', title: 'ID', type: 'string', isRequired: true }, { name: 'name', title: '产品名称', type: 'string', isRequired: true }, { name: 'price', title: '价格', type: 'number', isRequired: true } ] });

注册完成后,您就可以在整个应用中使用这个模型进行数据操作。引擎会自动处理模型的持久化和版本管理。

查找已注册的模型

使用 getModel 方法获取特定的模型定义:

const productModel = await engine.metaRegistry.getModel('Product'); if (productModel) { console.log('产品模型有', productModel.fields.length, '个字段'); }

您也可以获取所有已注册的模型列表:

const allModels = engine.metaRegistry.models; console.log('系统中共有', allModels.length, '个模型');

注册视图

视图定义了数据的展示方式。使用 updateOrRegisterView 方法注册视图:

await engine.metaRegistry.updateOrRegisterView({ modelName: 'Product', name: 'ProductFormView', title: '产品编辑表单', type: 'FormView', config: { fields: ['name', 'price'], submitAction: 'save' } });

查找视图时可以按模型名称和视图类型进行筛选:

// 查找产品模型的表单视图 const formView = engine.metaRegistry.findView('Product', 'FormView'); // 获取特定的视图 const gridView = engine.metaRegistry.getView('ProductGridView');

使用字段类型注册表

字段类型注册表管理所有可用的数据类型处理器。引擎预置了常用的字段类型,您也可以注册自定义类型。

注册自定义字段类型

当您需要特殊的数据处理逻辑时,可以创建并注册自定义字段类型:

// 定义自定义字段类型 const emailFieldTyper = { name: 'email', validate: (value) => { const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return emailRegex.test(value); }, format: (value) => value.toLowerCase().trim(), defaultValue: '' }; // 注册到字段类型注册表 engine.fieldTyperRegistry.registerFieldTyper(emailFieldTyper);

注册后,您就可以在模型字段中使用这个自定义类型:

await engine.metaRegistry.updateOrRegister({ name: 'User', title: '用户', fields: [ { name: 'email', title: '邮箱', type: 'email', isRequired: true } ] });

查找字段类型

使用 getFieldTyper 方法获取特定的字段类型处理器:

const stringTyper = engine.fieldTyperRegistry.getFieldTyper('string'); const emailTyper = engine.fieldTyperRegistry.getFieldTyper('email');

查看所有可用的字段类型:

const allTypers = engine.fieldTyperRegistry.getFieldTypers(); console.log('可用的字段类型:', allTypers.map(t => t.name));

使用组件注册表

组件注册表管理所有的UI组件,包括视图组件、渲染器和小部件。

注册自定义视图组件

当内置的视图组件无法满足需求时,您可以注册自定义的视图组件:

// 创建自定义视图组件 class CustomReportView extends EntityView { name = 'CustomReportView'; displayName = '自定义报表'; // ... 组件实现 } // 注册到组件注册表 engine.componentRegistry.registerView(new CustomReportView());

注册后,这个视图组件就可以在视图定义中使用:

await engine.metaRegistry.updateOrRegisterView({ modelName: 'SalesData', name: 'SalesReportView', title: '销售报表', type: 'CustomReportView' });

查找视图组件

使用 getView 方法获取已注册的视图组件:

const formView = engine.componentRegistry.getView('FormView'); const customView = engine.componentRegistry.getView('CustomReportView');

查看所有可用的视图组件:

const allViews = engine.componentRegistry.getViews(); console.log('可用的视图组件:', allViews.map(v => v.name));

注册自定义渲染器

渲染器负责特定字段或组件的渲染逻辑:

const customRenderer = { name: 'currency-renderer', component: CurrencyRenderer, fieldTypes: ['number'], props: { currency: 'CNY' } }; engine.componentRegistry.registerRenderer(customRenderer);

使用动作注册表

动作注册表管理所有的业务动作处理器,让您可以自定义数据操作的业务逻辑。

注册动作处理器

创建并注册处理特定业务逻辑的动作处理器:

const publishProductHandler = { actionNames: ['publishProduct'], async handle(context) { // 更新产品状态为已发布 await context.datasource.updateObject({ modelName: 'Product', id: context.objectId, values: { status: 'published', publishedAt: new Date() } }); // 发送通知邮件 await sendNotificationEmail(context.objectId); return { success: true, message: '产品已成功发布' }; } }; engine.actionRegistry.registerActionHandler(publishProductHandler);

调用已注册的动作

使用 getActionHandler 方法获取并执行动作:

const handler = engine.actionRegistry.getActionHandler('publishProduct'); if (handler) { const result = await handler.handle({ objectId: 'product-123', datasource: engine.datasourceFactory.create('Product') }); console.log(result.message); }

实际应用场景

创建主题化的组件套件

您可以创建一套主题一致的组件并批量注册:

// 注册企业主题的组件套件 const enterpriseComponents = [ new EnterpriseFormView(), new EnterpriseGridView(), new EnterpriseDashboardView() ]; enterpriseComponents.forEach(component => { engine.componentRegistry.registerView(component); }); // 注册配套的渲染器 const enterpriseRenderers = [ { name: 'enterprise-input', component: EnterpriseInput }, { name: 'enterprise-button', component: EnterpriseButton } ]; enterpriseRenderers.forEach(renderer => { engine.componentRegistry.registerRenderer(renderer); });

动态模块加载

在运行时动态加载和注册外部模块的组件:

// 动态加载第三方模块 const externalModule = await import('@company/advanced-charts'); // 注册模块中的字段类型 externalModule.fieldTypes.forEach(fieldType => { engine.fieldTyperRegistry.registerFieldTyper(fieldType); }); // 注册模块中的视图组件 externalModule.viewComponents.forEach(component => { engine.componentRegistry.registerView(component); });

环境特定的组件

根据运行环境注册不同的组件实现:

if (process.env.NODE_ENV === 'development') { // 开发环境注册调试组件 engine.componentRegistry.registerView(new DebugFormView()); engine.componentRegistry.registerRenderer({ name: 'debug-info', component: DebugInfoRenderer }); } else { // 生产环境注册优化组件 engine.componentRegistry.registerView(new OptimizedFormView()); }

最佳实践

统一命名规范

建立清晰的组件命名规范,便于管理和使用:

  • 模型名称使用 PascalCase:UserProductCategory
  • 视图名称包含模型和类型:UserFormViewProductGridView
  • 字段类型使用 camelCase:emailphoneNumber
  • 动作名称使用动词形式:publishProductsendEmail

组件版本管理

为自定义组件添加版本信息,便于升级和维护:

const customComponent = { name: 'AdvancedDataGrid', version: '2.1.0', author: 'Your Company', description: '高级数据表格组件', // ... 组件实现 };

注册表清理

在适当的时候清理不再使用的组件,避免内存泄漏:

// 应用退出或模块卸载时清理注册表 engine.metaRegistry.cleanup(); engine.componentRegistry.cleanup();

注册表系统为 Entity Engine 提供了强大的扩展能力。通过合理使用各种注册表,您可以构建功能丰富、高度定制化的应用系统。

下一步

了解注册表系统后,您可能想要:

Last updated on