第十九章 Caché 定义类映射

禄和宜
2023-12-01

第十九章 Caché 定义类映射

本章讨论类映射,它提供了一种自定义编译或删除类时发生的事情的方法。

介绍

类映射提供了一种自定义编译或删除类时发生的事情的方法。类映射将类定义与映射类相关联。映射类(从%Projection.AbstractProjection类派生)提供了Caché用来自动生成两次附加代码的方法:

  • 当类被编译时
  • 当类被删除时

每当编译类时,Java和C ++映射(因此称为“映射”的起源)都使用此机制来自动生成必要的客户端绑定代码(Java或C ++)。

向类添加映射

要将映射添加到类定义,请在类定义中使用Projection语句:

class MyApp.Person extends %Persistent
{
Projection JavaClient As %Projection.Java(ROOTDIR="c:\java");
}

本示例定义了一个名为JavaClient的映射,它将使用%Projection.Java投影类。调用映射类的方法时,它们将接收ROOTDIR参数的值。

一个类可以具有多个唯一命名的映射。在有多个映射的情况下,将在编译或删除一个类时调用每个映射类的方法。多个映射的处理顺序不确定。

Caché提供以下映射类:

描述
%Projection.Java生成Java客户端类以启用从Java对该类的访问。
%Projection.Monitor将此类注册为与CachéMonitor一起使用的程序。元数据将写入Monitor.Application,Monitor.Alert,Monitor.Item和Monitor.ItemGroup。创建一个新的持久类,称为Monitor.Sample。
%Projection.MV生成MV类,该类允许从MV访问该类。
%Projection.StudioDocument将此类注册为与Studio一起使用的程序。
%Studio.Extension.Projection将XData菜单块映射到菜单表。
%ZEN.Object.Projection%ZEN.Component.object类使用的映射类。这用于管理Zen组件的编译后操作。
%ZEN.PageProjection%ZEN.Component.page使用的投影类。目前,这没有任何作用。
%ZEN.Template.TemplateProjection%ZEN.Temple.studio模板类使用的映射类。

还可以创建自己的投影类,并以与任何内置映射类相同的方式使用它们。

创建一个新的映射类

要创建新的映射类,请创建%Projection.AbstractProjection类的子类,实现映射接口方法(请参见小节),并定义任何所需的类参数。

例如:

Class MyApp.MyProjection Extends %Projection.AbstractProjection
{

Parameter MYPARAM;

/// This method is invoked when a class is compiled
ClassMethod CreateProjection(cls As %String, ByRef params) As %Status
{
    w "a",!
    QUIT $$$OK
}

/// This method is invoked when a class is 'uncompiled'
ClassMethod RemoveProjection(cls As %String, ByRef params, recompile As %Boolean) As %Status
{
    w "b",!
    QUIT $$$OK
}

}

映射接口

每个映射类都实现了映射接口,这是在类的生命周期中响应某些事件而调用的一组方法。此接口包含以下方法:

CreateProjection()

CreateProjection()方法是一个类方法,它在完成类定义的编译后由类编译器调用。该方法将传递正在编译的类的名称以及包含为投影定义的参数值(由参数名表示)的数组。

RemoveProjection()

RemoveProjection()方法是一种调用以下方法的类方法:

  • 删除类定义时
  • 在重新编译课程时

向此方法传递要删除的类的名称,包含为映射定义的参数值(用参数名下标)的数组以及指示该方法是作为重新编译的一部分而调用,还是因为类定义为被删除。

编译包含映射的类定义时,会发生以下事件:

  1. 如果该类先前已编译过,则它将在新的编译开始之前被取消编译。也就是说,先前编译的所有结果都将被删除。这时,编译器将为每个映射调用带有标志 即将进行重新编译的标志的RemoveProjection()方法。

请注意,不能从RemoveProjection()方法中调用关联类的方法,因为该类目前不存在。

还要注意,如果将新的映射定义添加到先前已编译的类中(没有一个蛇),则即使从未调用过CreateProjection()方法,编译器也会在下一次编译时调用RemoveProjection()方法。RemoveProjection()方法的实现者必须对此可能性进行规划。

  1. 在类完全编译(即可以使用)之后,编译器将为每个映射调用CreateProjection()方法。
  2. 删除类定义时,将为每个映射调用带有标志已发生删除的标志的RemoveProjection()方法。
 类似资料: