Как разделить удаленный объект и интерфейс в Flash Builder Flex - PullRequest
0 голосов
/ 13 февраля 2012

Код ниже показывает, что интерфейс и удаленный объект закодированы в одном файле. Как разделить их на два файла?

Текущий код:

    <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 Ответ

2 голосов
/ 13 февраля 2012

Вы хотите создать заглушку на стороне клиента для вашей удаленной службы.Есть несколько шагов для правильной настройки.

Создайте интерфейс службы

Для краткости мы создадим интерфейс только одним методом, но вы можете добавитьстолько, сколько вам нужно.

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