如何在Flash Builder Flex中分离远程对象和界面

时间:2012-02-13 07:22:55

标签: flex remoting

下面的代码显示接口和远程对象在同一个文件中编码如何将它们分成两个文件?

当前代码:

    <s:RemoteObject id="ro"
                    destination="customerService" 
                    source="customerService" 
                    endpoint="http://localhost/amfphp/gateway.php"
                    showBusyCursor="true">
        <s:method name="getCustomer" result="getCustomer_resultHandler(event)">
            <s:arguments>
                <CusOpt>{''}</CusOpt>
                <option>{''}</option>
                <idcompany>{2}</idcompany>
            </s:arguments>
        </s:method>
        <s:method name="genPKID" result="genPKID_resultHandler(event)">
            <s:arguments>
                <idcompany>{2}</idcompany>
            </s:arguments>
        </s:method>
    </s:RemoteObject>   

错误的做法:

import mx.rpc.remoting.RemoteObject;


    public class CustomerRO extends RemoteObject
    {
        public function CustomerRO(destination:String=null)
        {
            super(destination);
            this.destination = "customerService";
            this.source = "customerService";
            this.endpoint = "http://localhost/amfphp/gateway.php";
            this.showBusyCursor = true;
        }
    }

1 个答案:

答案 0 :(得分:2)

您希望为远程服务创建客户端服务存根。有几个步骤可以正确设置。

创建服务界面

为简洁起见,我们将只使用一种方法创建一个界面,但您可以根据需要添加任意数量。

package be.vmm.user.service {
    import mx.rpc.AsyncToken;

    public interface ICustomerService{      
        function getCustomerById(id:int):AsyncToken;        
    }
}

创建接口的实现

在您的示例中,您正在扩展RemoteObject。我建议你把它封装起来:这会更加灵活。更不用说在您的代码中,连接信息是硬编码的,这需要您在每次信息更改时重新编译应用程序。

public class CustomerService implements ICustomerService {
    private var ro:RemoteObject;

    public function CustomerService(ro:RemoteObject) {
        this.ro = ro;
    }

    public function getCustomerById(id:int):AsyncToken {
        return ro.getCustomerById(id);
    }

}

您还可以选择创建该接口的另一个实现。最常见的用例包括创建一个无法真正连接到服务器但直接返回虚假数据的模拟服务。如果你想在没有服务器连接的情况下测试你的应用程序,你现在可以用模拟服务存根替换你的真实服务存根,因为它们都实现了相同的接口。

使用实施

var ro:RemotObject = new RemoteObject();
ro.destination = "customerService";
ro.source = "customerService";
ro.endpoint = "http://localhost/amfphp/gateway.php";
ro.showBusyCursor = true;
//these properties are best externalized in a configuration file

var service:ICustomerService = new CustomerService(ro);
var token:ASyncToken = service.getCustomerById(1);
token.addResponder(new Responder(handleResult, handleFault));

private function handleResult(event:ResultEvent):void {
    //do what you need to do
    trace(event.result as Customer);
}

private function handleFault(event:FaultEvent):void {
    //show error message
}