2012-02-29 63 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 = new RestClient(configurationData) 
restClient.getPerson(1) //Get Person 
restClient.getAuto(3) //Get an Auto 
restClient.getHouse(7) //Get a House 

我開始加入我RestClient類裏面這些包裝,但它變得非常臃腫的速度非常快,而且它認爲抽象應該在一個較高的水平。與我的客戶混合資源細節也感覺不對。

所以,相反我子類RestClient,並且每個資源有它自己的類。問題是,現在我要實例化一個新的客戶端爲每個不同的資源類型:

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

但現在我已經創建了一個新的Client類各Resource和我相當肯定這是一個非常糟糕的事情做。這也是一個痛苦,因爲我必須將連接配置數據綁定到每個連接配置數據,而這應該只發生一次。

當我想爲我的資源編寫抽象概念時,是否有一個很好的示例或模式?我的基地RestClient工作正常,但我不喜歡必須將我的應用程序代碼中的服務器端API位置。但我也不想爲每個想要與之交互的資源實例化一個專門的客戶端類。

回答

1

我處於類似的情況,並有我認爲是一個良好的實施與適當的抽象。無論我的解決方案是否是最佳做法,我都無法保證,但它相當輕巧。這是我如何把它架構:

我的UI層需要撥打電話到我的REST服務,所以我創建了一個名爲ServiceManagers.Interfaces.IAccountManager的抽象。該接口具有稱爲GetAccounts(Int64 userId)的方法。

然後,我創建了一個實現這個接口Rest.AccountManager,並注入到這一點我的AccountController。 Rest.AccountManager是對REST細節(URL,get/post/put ...,參數等)的包裝。

所以,現在我的UI代碼只需要調用accountManager.GetAccounts(userId)。你可以創建一個全能的界面,這樣你只有一個Get,但是我覺得它不那麼富有表現力。對於每個組件來說,可以有許多不同的接口(即:PersonManager,HouseManager,AutoManager),因爲每個組件都是一個單獨的問題,返回不同的數據。不要害怕有很多接口和類,只要你的名字具有表達力。

在我的例子,我的用戶界面具有用於每個控制器不同的管理器,並且提出的呼叫適當地適合每個控制器(即。GetAccounts爲的AccountController,GetPeople用於把PeopleController)。

此外,作爲對根的配置數據,你可以只使用一個configurationCreationFactory類什麼的。這樣所有的實現都在一個位置具有核心邏輯的適當配置。

這可能是一件很難解釋的事情,而且我知道我沒有做一份完美的工作,但希望這會有所幫助。我會盡量回頭清理它,特別是如果你沒有明確我的觀點:)

1

我在想這樣的事情,再次將你的終點映射到客戶端。您可以將映射作爲xml或可在應用程序啓動期間加載和緩存的屬性文件。該文件應該具有密鑰值對PERSON_ENDPOINT =/person/ AUTO_ENDPOINT =/equipment/auto/... 客戶端應該將此密鑰傳遞給工廠可能是ClientFactory,它具有此xml緩存並從緩存中檢索終點文件。參數可以作爲自定義對象或地圖傳遞給工廠。工廠會回覆完整的終點,例如「/ person/1」,您可以將其傳遞給客戶。這樣你就不需要爲客戶端設置不同的類。如果您不喜歡xml或文件,您可以將它作爲具有鍵值對的靜態地圖。如果它的xml或文件不需要每次改變代碼都是有利的。 希望這可以幫助你。