美文网首页
第二十三章 开发Productions - ObjectScri

第二十三章 开发Productions - ObjectScri

作者: Cache技术分享 | 来源:发表于2023-06-02 08:59 被阅读0次

    第二十三章 开发Productions - ObjectScript Productions - 定义消息

    定义消息

    消息正文可以是任何持久对象。

    实际上,通常会创建 Ens.Util.RequestBodyMethodsEns.Util.ResponseBodyMethods 的子类并添加属性。这将创建标准消息正文。如果使用这些类,可以轻松访问各种内置功能,以查看来自管理门户的消息内容。这些功能可帮助开发人员和管理员检测正在运行的产品中的错误,尤其是当产品使用消息内容来确定应将消息发送到何处时。

    一些电子文档——电子数据交换 (EDI) 格式,例如 X12——包含任意长和复杂的数据。在这种情况下,最好使用一个替代类,一个表示 IRIS® 虚拟文档的类。在这种情况下,消息正文没有一组属性来包含消息内容。有关详细信息,请参阅在作品中使用虚拟文档。

    本书中的大多数示例都采用标准消息体,具有相对较少的消息属性。

    创建一个简单的消息体类

    要创建消息类(用作消息正文),请创建一个类:

    • 扩展 Ens.Util.RequestBodyMethodsEns.Util.ResponseBodyMethods
    • 包含表示要在消息中携带的数据元素所需的属性。

    下面显示了一个简单的例子:

    Class Demo.Loan.Msg.CreditRatingResponse Extends Ens.Util.ResponseBodyMethods
    {
    
    Property TaxID As %String;
    
    Property CreditRating As %Integer;
    
    }
    

    该类还可以包含方法。例如:

    Class Demo.Loan.Msg.Application Extends Ens.Util.RequestBodyMethods
    {
    
    Property Amount As %Integer;
    Property Name As %String;
    Property TaxID As %String;
    Property Nationality As %String;
    Property BusinessOperationType As %String;
    Property Destination As %String;
    
    Method RecordNumber() As %String
    {
      If ..%Id()="" Do ..%Save()
      Quit ..%Id()
    }
    
    Method GetRecordNumberText(pFormatAsHTML As %Boolean = 0) As %String
    {
      Set tCRLF=$s(pFormatAsHTML:"<br>",1:$c(13,10))
      Set tText=""
      Set tText=tText_"Your loan application has been received,"_tCRLF
      Set tText=tText_"and is being processed."_tCRLF
      Set tText=tText_"Your record number is "_..RecordNumber()_"."_tCRLF
      Set tText=tText_"You'll receive a reply from FindRate"_tCRLF
      Set tText=tText_"within 2 business days."_tCRLF
      Set tText=tText_"Thank you for applying with FindRate."_tCRLF
      Quit tText
    }
    
    }
    

    另一种选择是创建自定义消息类,但是当您这样做时,定义类很重要,这样消息只存储在它们自己的表中,这样消息搜索就可以快速进行。为此,请在使用 %Persistent 作为主要超类,然后使用 Ens. 或中使用 Ens.Response,具体取决于这是请求消息还是响应消息。例如:

    Class Demo.Loan.Msg.CreditRatingResponse Extends (%Persistent, Ens.Response)
    {
    
    Property TaxID As %String;
    
    Property CreditRating As %Integer;
    
    }
    

    USEEXTENTSETDEFAULTGLOBAL 类参数提供了其他方法来确保消息存储在它们自己的表中;有关详细信息,请参阅 %Persistent 的类参考。)

    另一种选择是简单地创建一个基于持久类的类,并且可以选择将 %XML.Adaptor作为另一个超类包含中。 (%XML.Adaptor 支持在管理门户中以 XML 形式显示消息。)

    创建复杂的消息正文类

    在前面的示例中,消息正文类仅包含简单的属性。在某些情况下,可能需要定义使用其他类的属性。如果是这样,应该仔细考虑清除消息体时要做什么(如管理产品中所述)。

    当清除消息体时, IRIS 只会删除特定的消息体对象。例如,考虑以下消息类:

    Class Demo.MyApp.Messages.Person Extends Ens.Util.RequestBodyMethods
    {
    
    Property Name As %String;
    
    Property MRN As %String;
    
    Property BirthDate As %Date;
    
    Property Address As Demo.MyApp.Messages.Address;
    
    }
    
    

    地址类如下:

    Class Demo.MyApp.Messages.Address Extends %Persistent
    {
    
    Property StreetAddress As %String;
    
    Property City As %String;
    
    Property State As %String;
    
    Property ZIP As %String;
    }
    

    在这种情况下,如果清除消息体, IRIS 会删除 MyApp.Messages.Person 的实例,但不会删除 MyApp.Messages.Address 的实例。

    如果消息正文类使用其他类作为属性,并且如果应用程序要求也清除任何引用的对象,请使用以下方法之一:

    确保引用的类是串行的。例如,重新定义 Address 类如下:

    Class MyApp.Messages.Address Extends %SerialObject
    {
    ...
    }
    

    在这种情况下,Address 类的数据存储为Person 类的一部分(因此同时自动清除)。

    • 将属性定义为合适的关系。请参阅定义和使用类中的关系。
    • 向消息类添加删除触发器或 %OnDelete() 方法,以便此类删除引用类中的适当记录。
    • 可选择将 %XML.Adaptor 作为超类包含在,以便在管理门户中显示在引用类中定义的属性。

    设置消息清除行为

    定义消息主体类时,可以包含 ENSPURGE 参数以指定 IRIS 在清除操作期间如何处理该类的实例。该参数有两个可能的值:

    • 0IRIS 不会根据类别清除消息体,即使启用了清除消息体的选项也是如此。
    • 1 — 启用清除消息体选项时 IRIS 根据类别清除消息体。

    ENSPURGE 参数影响管理门户的所有清除,但企业消息库的清除除外。同样,它会影响使用新选项卡类中 Ens.MessageHeaderPurge() 方法的编程清除。

    例如,考虑 Sample.Person 持久数据库类:

    Class Sample.Person Extends (%Persistent, %Populate, %XML.Adaptor)
    
    {
    Property Name As %String(POPSPEC = "Name()") [ Required ];
    
    Property SSN As %String(PATTERN = "3N1""-""2N1""-""4N") [ Required ];
    
    Property DOB As %Date(POPSPEC = "Date()");
    
    ...
    }
    

    如果将生产配置为 Sample.Person 对象发送到更新患者信息的业务操作,则保留这些对象可能很重要。为确保系统不会清除 Sample.Person 消息正文类的任何实例,可以将 ENSPURGE 参数添加到类定义中,如下所示:

    Class Sample.Person Extends (%Persistent, %Populate, %XML.Adaptor)
    
    {
    Parameter ENSPURGE As %Boolean = 0;
    
    Property Name As %String(POPSPEC = "Name()") [ Required ];
    
    Property SSN As %String(PATTERN = "3N1""-""2N1""-""4N") [ Required ];
    
    Property DOB As %Date(POPSPEC = "Date()");
    
    ...
    }
    

    在随后的清除过程中,系统仅删除基于 Sample.Person 消息正文类的消息标头。消息体本质上是孤立的,只能以编程方式删除。有关详细信息,请参阅清除生产数据。

    ENSPURGE 参数是可继承的,不是必需的。默认值为 1

    相关文章

      网友评论

          本文标题:第二十三章 开发Productions - ObjectScri

          本文链接:https://www.haomeiwen.com/subject/bnipedtx.html