我正在使用 cairngorm 模块库和 Parsley 在 Flex 中开发应用程序。
Parsley 文档第 5 章说:“当您想决定是否应将消息传递给处理程序时,拦截器可能会派上用场”。
使用 ModuleMessageInterceptor 时,上述情况不正确。这意味着我的 MessageHandler 在 MessageInterceptor 之前接收到消息。
有谁知道解决方法?
问候,
法迪
我正在使用 cairngorm 模块库和 Parsley 在 Flex 中开发应用程序。
Parsley 文档第 5 章说:“当您想决定是否应将消息传递给处理程序时,拦截器可能会派上用场”。
使用 ModuleMessageInterceptor 时,上述情况不正确。这意味着我的 MessageHandler 在 MessageInterceptor 之前接收到消息。
有谁知道解决方法?
问候,
法迪
这个问题的解决方案是扩展 ModuleMessageInterceptor 类,如下所示:
package fr.core.patch.cairngorm
{
import com.adobe.cairngorm.module.ModuleIdMetadata;
import com.adobe.cairngorm.module.ModuleMessageDispatcher;
import com.adobe.cairngorm.module.ModuleMessageInterceptor;
import com.adobe.cairngorm.module.ParsleyModuleMessage;
import flash.system.ApplicationDomain;
import org.spicefactory.lib.reflect.ClassInfo;
import org.spicefactory.lib.reflect.Property;
import org.spicefactory.parsley.core.registry.ObjectDefinitionRegistry;
import org.spicefactory.parsley.core.registry.RootObjectDefinition;
import org.spicefactory.parsley.tag.messaging.MessageHandlerDecorator;
import org.spicefactory.parsley.tag.messaging.MessageInterceptorDecorator;
public class ATPModuleMessageInterceptor extends ModuleMessageInterceptor
{
public function ATPModuleMessageInterceptor()
{
super();
}
public var order:int;
private var target:Property;
override public function process(registry:ObjectDefinitionRegistry):void
{
target=getModuleIdTargetProperty(registry.domain);
var interceptor:MessageInterceptorDecorator=new MessageInterceptorDecorator();
interceptor.type=type;
interceptor.selector=selector;
interceptor.method="interceptModuleMessage";
interceptor.order = order;
var messageHandler:MessageHandlerDecorator=new MessageHandlerDecorator();
messageHandler.type=ParsleyModuleMessage;
messageHandler.method="parsleyModuleMessageHandler";
var definition:RootObjectDefinition=registry.builders.forRootDefinition(ModuleMessageDispatcher).decorators([interceptor, messageHandler]).buildAndRegister();
definition.constructorArgs.addValue(target);
if (moduleRef)
{
definition.constructorArgs.addIdReference(moduleRef);
}
}
private function getModuleIdTargetProperty(domain:ApplicationDomain):Property
{
var props:Array=ClassInfo.forClass(type, domain).getProperties();
for each (var prop:Property in props)
{
if (prop.hasMetadata(ModuleIdMetadata))
{
return prop;
}
}
return null;
}
}
}
通过执行上述操作,我们将 order 属性添加到 ModuleMessageInterceptor 中,从而解决了我遇到的问题。
问候,
法迪曼苏尔
在 Parsley 2.4 中,MessageInterceptors 已被弃用:
而且 ModuleMessageInterceptor 不是 Parsley 的东西,它是 Cairngorm 的东西。就个人而言,由于我的经验,我会完全远离凯恩戈姆。上网查了一下,发现其他人也有类似的问题。您最好的选择是在同一个论坛上发帖并希望有人提供帮助。