2012-02-29 35 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或文件不需要每次改变代码都是有利的。 希望这可以帮助你。