2

有誰知道一個框架,最好是讓Flex編譯器運行一個擴展或者可能只是一個構建步驟,以便我們可以生成我們應用程序的數據模型的強類型代理類。用於懶惰實例化的Flex強類型代理類

有2周主要的事情,我們希望與代理的做:

  1. 在運行時,我們要懶洋洋地分析和實例的實例作爲訪問(類同Java的Hibernate怎樣有懶代理對象)
  2. 在編輯器應用程序中,我們要實現setter調用,以便我們可以跟蹤哪些對象已被修改
    • 除了像編程設置ChangeWatcther之類的事情之外,代理服務器在這種情況下確實非常必要,因爲我們需要跟蹤Array添加/刪除以及可能跟蹤「參考」obj學分,這樣,當「參考鍵」改變我們所知道的拯救那些被重點

引用它在,我們要基本抽象當對象從序列化加載代理首例對象數據,但如果它是真實的對象,仍然會傳遞相同的公共屬性和數據訪問模式。

基本上,代理會在第一次調用方法時實例化對象。

我知道我們可以使用一些AS3字節碼庫,如as3-commons-bytecode

或可能重新調整GraniteDS代碼生成。

我寧願生成代碼,因爲它是一個確定性的東西,如果我們能夠在運行時更容易地調試它,它會很好。

有誰知道我是否可以像MXMLC那樣從MXML文件生成AS3代碼。

還有無論如何控制編譯管道中的「何時」我可以生成代碼,因爲我們有很多數據對象使用公共字段而不是getter/setters,但是[Bindable],所以如果我可以根據生成的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; 
    } 

} 
+0

不知道;但請查看dbHibernate http://code.google.com/p/dphibernate/。這可能是你正在尋找的東西。 – JeffryHouser

回答

2

挖得更深一些,到AS3-共享字節代碼庫,它看起來像他們支持生成代理類和攔截。

  • http://www.as3commons.org/as3-commons-bytecode/proxy.html

    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; 
         } 
        } 
    } 
    }