Façade - 接受对象实例或单个参数?

时间:2009-07-22 14:53:44

标签: java web-services

我正在创建一个无状态会话bean(façade),用于“管理”某个特定实体,我们称之为产品。将有方法添加新产品,更新现有产品,获取产品等(我使用Hibernate进行持久化,因此我有一个“ProductDbManager”bean,façade将用于进行数据库访问)。

此bean将作为Web服务公开,因此可以从Web界面和简单的桌面应用程序调用它。

我的问题是, AddProduct 等方法接受Product实例或“Name”,“Description”,“Price”等个别参数是最佳做法吗?等?

最初可能只使用“名称”创建产品,或者可能是“名称”和“描述”,或者设置所有属性,等等。从这个角度来看,只需接受Product实例就可以更简单(就创建外观而言),以便客户端可以简单地创建一个新产品,设置可用的属性,然后传入。

使用替代选项,我需要创建一些 AddProduct 的重载,以便接受不同的参数。但是,为了尽可能灵活并使外观的使用者的生活更轻松,这是否更可取?两种选择都应该可用吗?

2 个答案:

答案 0 :(得分:1)

我更喜欢直接添加Product实例。如果您担心创建Product个实例的客户端代码,则可以提供ProductFactory,然后可以使用所有这些重载方法来设置Product的部分内容。

答案 1 :(得分:1)

我更喜欢使用Web服务方法来接收表示相关数据项的对象。

有时对于非平凡的方法,到了:

DoActionResponse doAction(DoActionRequest request);

作为我的网络服务方法。然后,Web服务实现将执行输入验证(与servlet在将表单输入传递到代码核心之前验证表单输入的方式相同)以及必要的数据映射到核心代码所期望的内容。为何选择数据?我发现拥有一个与我的内部核心系统数据模型分开的Web服务数据模型允许我根据需要更新我的内部模型,而不会更改外部模型,从而影响客户端。

对于你的,我有

boolean addProduct(Product toAdd);

为了防止向Product添加更多字段,您无需更改Web服务界面,这最终会导致五个人不得不在三年后更改其代码,因为他们的系统背负着您的系统网络服务。

我还会考虑一些身份验证,以便只有管理员用户才能操作数据库。 SOAP有这方面的东西,或者你可以:

boolean addProduct(Product toAdd, Authentication auth);

AuthToken login(String username, String password);
boolean addProduct(Product toAdd, AuthToken token); // token is a string really. like a session id

但是如何将错误返回给客户端,而不仅仅是真/假?当然,有SOAPFault,但它的水平相当低。这就是为什么我有时会有响应对象,其中对象中的一个字段是一个错误对象数组(错误代码,错误消息等)。