2012-02-29 4 views
0

私はうまく動作する単純なRESTクライアントを持っています。うまく動作しますが、物事はより複雑になっていると私は特定のリソースの場所からアプリケーションコードを離婚したいRESTfulリソースと対話するための抽象概念をきれいに記述するにはどうすればよいですか?

restClient = new RestClient(configurationData) 
restClient.get('/person/1') //Get Person 
restClient.get('/equipment/auto/3') //Get an Auto 
restClient.get('/house/7') //Get a House 

:私のアプリケーションのコードでは、私はこのような何かを行います。

私はサービスの周りにラッパーを書くことができます。サービスの周りには、リソースの場所が格納されていて、アプリケーションコードに入れないようにすることができます。私は私のRestClientクラスの内部でこれらのラッパーを追加し始めたが、それは非常に速く非常に肥大化しました、そしてそれは抽象化は、より高いレベルであることを感じました

restClient = new RestClient(configurationData) 
restClient.getPerson(1) //Get Person 
restClient.getAuto(3) //Get an Auto 
restClient.getHouse(7) //Get a House 

:私は私のコードをよりこのように探し始めることを期待します。クライアントとリソースの詳細を混在させることも間違っていました。

代わりに、RestClientをサブクラス化し、各リソースには独自のクラスがあります。問題は、今、私はすべての異なるリソースタイプの新しいクライアントをインスタンス化しなければならないということです。

personRestClient = new PersonRestClient(configurationData) 
personRestClient.get(1); 
autoRestClient = new AutoRestClient(configurationData) 
autoRestClient.get(3); 
housesRestClient = new HousesRestClient(configurationData) 
housesRestClient.get(7); 

しかし、今、私は、各Resourceのための新しいClientクラスを作成しましたし、私は非常に悪いことがあることがかなり確信しています行う。これは一度だけ行う必要があるときに、私は接続構成データをそれぞれに結びつけなければならないので、痛みもあります。

私のリソースの抽象概念を書くときには、私が従うべき良い例がありますか?私のベースRestClientは正常に動作しますが、私はアプリケーションコードにサーバー側のAPIの場所を入れなければならないのは嫌です。しかし、私はまた、私がやりとりしたいと思う各リソースのための1つの特殊なクライアントクラスをインスタンス化する必要はありません。

答えて

1

私は似たような状況にあり、適切な抽象概念を持つ良い実装であると考えているものを持っています。私のソリューションがベストプラクティスであろうとなかろうと、私はそれを保証することはできませんが、かなり軽量です。ここで私はそれをどのように構築しているのですか:

私のUIレイヤーはRESTサービスを呼び出す必要があるので、ServiceManagers.Interfaces.IAccountManagerという抽象を作成しました。このインターフェイスには、GetAccounts(Int64 userId)というメソッドがあります。

次に、このインターフェイスを実装したRest.AccountManagerを作成し、それを私のAccountControllerに挿入しました。 Rest.AccountManagerは、RESTの仕様(URL、get/post/put ...、parametersなど)をラップします。

これで、私のUIコードはaccountManager.GetAccounts(userId)を呼び出すだけです。あなたはGetしか持っていないように、包括的なインターフェースを作成することができますが、それは表現力がありません。 PersonManager、HouseManager、AutoManagerといった各コンポーネントには、異なるデータを返す別々の関心事であるため、多くの異なるインターフェースを持つことができます。あなたの名前が表明的である限り、多くのインターフェースやクラスを持つことを恐れないでください。

私の例では、私のUIにはそれぞれのコントローラーごとに異なるマネージャーがあり、コールは適切に各コントローラーに適合します(AccountControllerのGetAccounts、PeopleControllerのGetPeople)。

また、ルートコンフィグレーションデータについては、configurationCreationFactoryクラスなどを使用できます。このように、すべての実装は、1つの場所にコアロジックを持つ適切な構成を持っています。

これは説明するのが難しい場合がありますが、私は完璧な仕事をしなかったことを知っていますが、うまくいけば少し助けてください。私は後でやり直して、後でそれをきれいにするつもりです。特に私の要点を得られないのであれば。

1

私はこのような何かを考えています。あなたのエンドポイントをクライアントにマッピングする方法もあります。あなたは、アプリケーションの開始時にロードしてキャッシュすることができるXMLまたはプロパティファイルとしてマッピングを持つことができます。ファイルにはキー値のペアが含まれている必要があります PERSON_ENDPOINT =/person/ AUTO_ENDPOINT =/equipment/auto/... クライアントはこのxmlキャッシュを持つClientFactoryで、このキーを工場に渡す必要があります。ファイル。パラメータは、カスタムオブジェクトまたはマップとしてファクトリに渡すことができます。工場はあなたのクライアントに渡すことができる完全なエンドポイント「/人/ 1」を返します。この方法では、クライアントに対して異なるクラスを持つ必要はありません。あなたがXMLやファイルが好きでなければ、キー値のペアを持つ静的なマップとして持つことができます。そのXMLやファイルが必要でない場合は、その都度コードが変更される必要があります。 これがあなたを助けてくれることを願っています。

関連する問題