Biztalk Orchestration中消息Promote Property的读问题
Posted on 2007-04-10 19:39 鸡尾虾的壳 阅读(256) 评论(0) 编辑 收藏 举报
Biztalk中,Message的Promote Property有两类:基于MessageDataPropertyBase 与 基于MessageContextPropertyBase的提升属性。
假设有两个Message:Msg_In与Msg_Out, 属于同一个XSD类型。属性XSD定义了两个Promote Property: ContestPropertyTestNS.f1(MessageDataPropertyBase) , ContestPropertyTestNS.f_msgContextBase(MessageContextPropertyBase)。Msg_In
是初始接收消息。
分别测试了下面的几段代码。
Seg1:
Msg_Out=Msg_In;
Msg_Out(ContestPropertyTestNS.f_msgContextBase)="ddd33333";
System.Diagnostics.Trace.Write(Msg_Out(ContestPropertyTestNS.f_msgContextBase));
测试结果:OK!
Seg2:
Msg_Out=Msg_In;
Msg_Out(ContestPropertyTestNS.f_msgContextBase)=Msg_In(ContestPropertyTestNS.f_msgContextBase);
System.Diagnostics.Trace.Write(Msg_Out(ContestPropertyTestNS.f_msgContextBase));
测试结果:Error!!!
Seg3:
Msg_Out=Msg_In;
Msg_Out(*)=Msg_In(*);
System.Diagnostics.Trace.Write(Msg_Out(ContestPropertyTestNS.f_msgContextBase));
测试结果:Error!!!
Seg4:
Msg_Out=Msg_In;
System.Diagnostics.Trace.Write(Msg_Out(ContestPropertyTestNS.f1));
测试结果:OK!
Seg1~4说明:MessageDataPropertyBase类型的属性是可读的(消息构造阶段可写)。新构造消息的MessageContextPropertyBase类型的属性初始值为null,所以必须先赋值在读。特别的,Msg_Out(*)=Msg_In(*),这段代码会读Msg_In中MessageContextPropertyBase类型的属性,所以也会抛出异常。
个人对这种设计的解释:MessageContextPropertyBase类型的属性的唯一使命消息路由。对于Msg_In来说,它是消息路由的终点,因此它的所有该类型的属性的生命周期已经结束,从此这类Promote属性不可读也不可写。但是对于Msg_Out来说,它的生命周期刚刚开始,在它的构造阶段,显然有必要提供对这些属性的写功能。
鸡尾虾的壳
假设有两个Message:Msg_In与Msg_Out, 属于同一个XSD类型。属性XSD定义了两个Promote Property: ContestPropertyTestNS.f1(MessageDataPropertyBase) , ContestPropertyTestNS.f_msgContextBase(MessageContextPropertyBase)。Msg_In
是初始接收消息。
分别测试了下面的几段代码。
Seg1:
Msg_Out=Msg_In;
Msg_Out(ContestPropertyTestNS.f_msgContextBase)="ddd33333";
System.Diagnostics.Trace.Write(Msg_Out(ContestPropertyTestNS.f_msgContextBase));
测试结果:OK!
Seg2:
Msg_Out=Msg_In;
Msg_Out(ContestPropertyTestNS.f_msgContextBase)=Msg_In(ContestPropertyTestNS.f_msgContextBase);
System.Diagnostics.Trace.Write(Msg_Out(ContestPropertyTestNS.f_msgContextBase));
测试结果:Error!!!
Seg3:
Msg_Out=Msg_In;
Msg_Out(*)=Msg_In(*);
System.Diagnostics.Trace.Write(Msg_Out(ContestPropertyTestNS.f_msgContextBase));
测试结果:Error!!!
Seg4:
Msg_Out=Msg_In;
System.Diagnostics.Trace.Write(Msg_Out(ContestPropertyTestNS.f1));
测试结果:OK!
Seg1~4说明:MessageDataPropertyBase类型的属性是可读的(消息构造阶段可写)。新构造消息的MessageContextPropertyBase类型的属性初始值为null,所以必须先赋值在读。特别的,Msg_Out(*)=Msg_In(*),这段代码会读Msg_In中MessageContextPropertyBase类型的属性,所以也会抛出异常。
个人对这种设计的解释:MessageContextPropertyBase类型的属性的唯一使命消息路由。对于Msg_In来说,它是消息路由的终点,因此它的所有该类型的属性的生命周期已经结束,从此这类Promote属性不可读也不可写。但是对于Msg_Out来说,它的生命周期刚刚开始,在它的构造阶段,显然有必要提供对这些属性的写功能。
鸡尾虾的壳