Actionscript 3 用于延迟实例化的Flex强类型代理类

Actionscript 3 用于延迟实例化的Flex强类型代理类,actionscript-3,apache-flex,code-generation,proxy-classes,graniteds,Actionscript 3,Apache Flex,Code Generation,Proxy Classes,Graniteds,有人知道框架吗?最好是让Flex编译器运行扩展的某种方式,或者可能只是一个构建步骤,我们可以生成应用程序数据模型的强类型代理类 我们希望对代理服务器执行两项主要操作: 在运行时,我们希望在被访问时惰性地解析和实例化实例(类似于Java的Hibernate如何具有惰性代理对象) 在编辑器应用程序中,我们希望实现setter调用,以便跟踪已修改的对象 在这种情况下,除了通过编程设置ChangeWatther之外,代理是非常必要的,因为我们需要跟踪数组的添加/删除,并可能跟踪“引用”对象,这样当“引

有人知道框架吗?最好是让Flex编译器运行扩展的某种方式,或者可能只是一个构建步骤,我们可以生成应用程序数据模型的强类型代理类

我们希望对代理服务器执行两项主要操作:

  • 在运行时,我们希望在被访问时惰性地解析和实例化实例(类似于Java的Hibernate如何具有惰性代理对象)
  • 在编辑器应用程序中,我们希望实现setter调用,以便跟踪已修改的对象
    • 在这种情况下,除了通过编程设置ChangeWatther之外,代理是非常必要的,因为我们需要跟踪数组的添加/删除,并可能跟踪“引用”对象,这样当“引用键”被更改时,我们就可以保存那些按键引用它的对象
  • 在第一种情况下,我们希望代理在从序列化数据加载该对象时基本上进行抽象,但如果该对象是真实对象,则仍然使用相同的公共属性和数据访问模式传递该对象的引用

    基本上,代理将在第一次对对象调用方法时实例化该对象

    我知道我们可以使用一些AS3字节代码库,比如

    或者可能重新调整GraniteDS代码生成的用途

    我更喜欢生成代码,因为它是一种确定性的东西,如果我们能有一种更容易在运行时调试它的方法,那就太好了

    有人知道我是否可以像MXMLC那样从MXML文件生成AS3代码

    在编译管道中,我还可以控制“何时”生成代码,因为我们有很多使用公共字段而不是getter/setter的数据对象,但这些数据对象是可绑定的,因此如果我可以基于生成的getter/setter方法生成代理,那么代理就可以工作了

    下面是一个示例应用程序数据对象和代理类:

    [Bindable]
    public class PersonDTO implements Serializable {
        private var _name:String;
    
        private var _age:Number
    
    
        public function get age():Number {
            return _age;
        }
    
        public function set age(a:Number):void {
            _age = a;
        }
    
        public function get name():String {
            return _name;
        }
    
        public function set name(n:String):void {
            _name = n;
        }
    
        public void readObject(data:*) {
            //...
        }
    
    }
    
    // GENERATED CLASS BASED ON PersonDTO
    public class LazyProxy_PersonDTO extends PersonDTO {
    
        private var _instance:PersonDTO = null;
        private var _instanceData:*;
    
        private function getInstance():void {
            if (_instance == null) {
                _instance = new PersonDTO();
                _instance.readObject(_instanceData);
            }
        }
    
        override public function get age():Number {
            //Ensure object is instantiated
            return getInstance().age;
        }
    
        override public function get name():String {
            //Ensure object is instantiated
            return getInstance().name;
        }
    
    }
    
    // GENERATED CLASS BASED ON PersonDTO
    public class LogChangeProxy_PersonDTO extends PersonDTO {
    
        //This will be set in the application
        public var instance:PersonDTO;
    
        //set by application
        public var dirtyWatcher:DirtyWatcherManager;
    
        override public function set age(a:Number):void {
            dirtyWatcher.markAsDirty(instance);
            instance.age = a;
        }
    
    }
    

    深入挖掘AS3 Commons字节码库,看起来它们支持生成代理类和拦截器


    不确定;但是看看dbHibernate。这可能就是你要找的。
    public class DirtyUpdateInterceptor implements IInterceptor {
    
    public function DirtyUpdateInterceptor() {
        super();
    }
    
    public function intercept(invocation:IMethodInvocation):void {
        if (invocation.kind === MethodInvocationKind.SETTER) {
            if (invocation.arguments[0] != invocation.instance[invocation.targetMember]) {
                invocation.instance.isDirty = true;
            }
        }
    }
    }