本章讨论类映射,它提供了一种自定义编译或删除类时发生的事情的方法。
类映射提供了一种自定义编译或删除类时发生的事情的方法。类映射将类定义与映射类相关联。映射类(从%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()方法是一个类方法,它在完成类定义的编译后由类编译器调用。该方法将传递正在编译的类的名称以及包含为投影定义的参数值(由参数名表示)的数组。
RemoveProjection()方法是一种调用以下方法的类方法:
向此方法传递要删除的类的名称,包含为映射定义的参数值(用参数名下标)的数组以及指示该方法是作为重新编译的一部分而调用,还是因为类定义为被删除。
编译包含映射的类定义时,会发生以下事件:
请注意,不能从RemoveProjection()方法中调用关联类的方法,因为该类目前不存在。
还要注意,如果将新的映射定义添加到先前已编译的类中(没有一个蛇),则即使从未调用过CreateProjection()方法,编译器也会在下一次编译时调用RemoveProjection()方法。RemoveProjection()方法的实现者必须对此可能性进行规划。