ModuleMessageInterceptor vs MessageInterceptor

cairngorm flex module parsley
ModuleMessageInterceptor vs MessageInterceptor

cairngormモジュールライブラリとParsleyを使用して、Flexでアプリケーションを開発しています。

Parsleyのドキュメントの第5章には、「メッセージをハンドラーに渡すかどうかを決定するときにインターセプターが役立つことがあります」とあります。

ModuleMessageInterceptorを使用する場合、上記は当てはまりません。 つまり、MessageHandlerはMessageInterceptorの前にメッセージを受信します。

誰かが回避策を知っていますか?

よろしく、

Fadi

  1  0


ベストアンサー

この問題の解決策は、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;
        }
    }
}

上記を行うことで、OrderMessageプロパティをModuleMessageInterceptorに追加して、私が抱えていた問題を解決しました。

よろしく、

ファディマンスール

1


Parsley 2.4では、MessageInterceptorsは廃止されました。

そして、ModuleMessageInterceptorはParsleyのものではなく、Cairngormのものです。 個人的には、私はケアンゴームを使った経験があるので、ケアンゴームには近づかないでしょう。 オンラインで確認したところ、http://forums.adobe.com/thread/633032 [他の人も同様の問題を抱えていた]とわかりました。 あなたの最善の策は、同じフォーラムに投稿することであり、誰かが助けてくれることを願っています。

0


タイトルとURLをコピーしました