我正在用java创建一个web应用程序,在这里我需要模拟以下流程。
当用户触发某个进程(将产品添加到购物车)时,我需要通过以下步骤
虽然我在这里遗漏了很多用例(不希望问题长度增加很多),但大部分流程将与我在上面的步骤中描述的相同。
我的流将从Controller
开始,并将流向Service
层,而不是最终进入DAO
层。
因为会有很多用例需要检查HTTP,并且基于这种需要调用Service
层,所以我计划添加一个Facade
层,它应该负责为我做这件事,比如检查Session
和与Service
层交互。
请建议这是否是一个有效的方法,或任何其他最好的方法可以在这里实施?
还有一点我很困惑,那就是如何在外观层处理HTTP session
?我是否需要每次调用我的Facade
时传递HTTP对象,或者这里可以使用任何其他方法?
发布于 2013-09-14 12:58:13
当我查看您的用例时,我开始考虑关注点的分离。
然后我想:
所以我首先要说的是:
Status addItemToCart(HttpServletRequest request, Item item) {
if(request.getSession(false) == null) return needLogin(request)
UserCart cart = service.addItemToCart(item, new UserCart(session))
return cart.saveToSession(session)
}
UserCart addItemToCart(Item item, UserCart userCart) {
if userCart.needsCart() {
userCart = cartDAO.getNewCart(userCart)
}
userCart.addItem(Item)
return cartDAO.updateCart(userCart)
}
我的服务层测试将坚持类似UserCart的内容,以避免我不得不模拟HTTPServletRequests并创建10行设置代码。UserCart只是一个简单的数据传输对象,它提供了一些方便的方法,但是它使所有的事情都更容易理解。用户有--购物车对这个用例很重要,所以它是我大脑运行得很快的地方。这也使我们能够避免所有的空检查和嵌套块,当您不辞辛苦地避免创建简单的域特定概念时,这些检查和嵌套块就会猖獗。
发布于 2013-04-17 05:33:35
我总是希望以最简单的方式编写我的应用程序。我会在我的服务层本身完成所有这些工作。下面是我的伪代码:
/**
* @param request HttpServletRequest
* @param item Item to be added
*/
private void addItemToCart(HttpServletRequest request, Item item) {
UserVO user = null;
ShoppingCart cart = null;
ShoppingCartDAO cartDAO = new ShoppingCartDAO();
HttpSession session = request.getSession(false);
// check if its an existing session
if(session!=null){
// get the user ifo from the session
user = (UserVO)session.getAttribute("userVO");
// try to get the cart from the session
cart = (ShoppingCart)session.getAttribute("cart");
if(cart==null) {
// try to get the cart from DB
cart = cartDAO.getShoppingCart(user);
if(cart==null){
// create a new cart
ShoppingCart cart = new ShoppingCart(user);
}
}
// add item to the cart
cart.addItem(item);
// set it in session
session.setAttribute("cart",cart);
// update the DB
cartDAO.updateShoppingCart(user);
}
}
编辑:我相信您可以创建一个Interface
来包装request
对象,并将Interface
的实现作为参数传递给Service
方法。
https://softwareengineering.stackexchange.com/questions/195191
复制相似问题