我以这种方式工作(Struts2 +休眠):
我的Struts操作仅负责在Web浏览器上显示信息。没想
用户->操作->服务->存储库->数据访问
要么:
我想看->如何看->怎么做->如何获得->从哪里获得
因此,在第一层(视图)中,我有类似以下内容:
public String execute () {
try {
CourseService cs = new CourseService();
Course course = cs.getCourse(idCourse);
} catch (NotFoundException e) {
setMessageText("Course not found.");
} catch (Exception e) {
}
return "ok";
}
如您所见,我的“观点”没有思考。它要求提供特定课程的服务(用于管理课程)。该服务可以做更多的事情,例如报告,搜索等等。结果始终是列表或特定对象(如示例)。这些服务是真实的机器,可以应用规则并访问存储库(以管理数据)。
因此,如果将我的服务,存储库和DAOS放在不同的库中,则即使在基于文本的程序或基于Windows的桌面系统中也无需更改,也可以使用它。
该服务知道该怎么做,但不知道如何显示。该视图知道如何显示,但不知道该怎么做。与服务/存储库相同:服务发送和请求数据,但不知道数据在哪里以及如何获取。存储库将原始数据“组成”到buisines对象,以便服务可以使用。
但是存储库对数据库一无所知。DAO与数据库类型(MySQL,PostgreSQL等)有关。
如果要更改数据库,则可以更改DAO,并且它一定不会影响上层。如果要更新数据管理,则可以更改存储库,但这不能影响DAO和上层。如果您想更改逻辑,则可以更改服务,但这一定不能弄乱上方或下方的层。
您可以更改任何可见的内容,甚至可以更改技术(Web,桌面,文本),但这绝不能暗示以下任何内容。
业务逻辑是服务。但是如何与之互动是有待观察的。现在显示什么按钮?用户可以看到此链接吗?认为您的系统是基于控制台的程序:您是否必须拒绝错误的用户选择#> myprogram -CourseService -option=getCourse -idCourse=234
或阻止他按下键来编写此命令?
在基于Web的系统(Struts + JavaEE)中进行交谈我有一个单独的GUI控制器程序包。在视图操作中,我给了登录用户,而类给了我按钮(或我想要的任何界面元素)。
<div id="userDetailSubBox">
<c:forEach var="actionButton" items="${actionButtons}" varStatus="id">
${actionButton.buttonCode}
</c:forEach>
</div>
和
private List<ActionButton> actionButtons;
切记不要将其保留在服务范围之外。这是VIEW资料。将其保留在Struts动作中。任何接口的交互都必须与真实的业务代码完全分开,因此,如果您移植系统,将很容易削减不再需要的内容。