应该在三层系统中放置业务逻辑?

时间:2014-05-04 08:00:59

标签: java swing hibernate jsf

我知道有很多关于我的问题的问题,我已经阅读了很多,但我仍然觉得有点愚蠢,因为我还没有得到它。所以我在我的特定问题上尝试它。

我正在实施学校的工作。它应该是信息系统的一部分,必须是分层的。我们必须用Java或C#编写它(我选择了Java)。在我的例子中,我们必须使用两个不同的数据源和两个不同的视图,oracle db和xml作为数据源,Java Swing和JSF作为视图。

根据Martin Fowler撰写的#34;企业应用程序架构模式"有三个主要层:

  1. 数据源层:我已经使用Hibernate ORM生成了实体,我创建了数据访问对象来实现更简单的界面"获取数据。
  2. 域层: ...
  3. 表示层:我已经创建了Swing GUI和一些带有MVC逻辑的.xhtml页面
  4. 如果没有任何"计算"在系统中,但只有简单的实现和返回数据,我完成了,一切都很好。但是我,例如,实施系统,应该管理体育舞蹈的比赛,在比赛期间我需要为每一轮产生一对情侣,比赛结束后我需要计算每个舞者的分数,必要时增加点数等等。

    我知道,这是Domain层(业务逻辑)的责任,但我的代码在哪里?我应该选择这些对象的名称以及将它们放在我的代码结构中的位置?

    我的结构:

    • hibernate.cfg.xml(hibernate的配置)
    • hibernate.reveng.xml(hibernate的逆向工程文件)
    • isets.dao(package)
      • isets.dao.hibernate(package)
        • HbmCompetitionDao.java(竞赛实体的数据访问对象)
        • ...
      • isets.dao.xml(包)
        • ...(其他实体的数据访问对象,以XML格式存储)
    • isets.entities(package)
      • Competition.hbm.xml(生成的实体)
      • Competition.java
      • ...
    • isets.util(package)
      • HibernateUtil.java(获取会话工厂对象的文件)

    我应该在哪里设置我的业务逻辑以及这些类的名称应该是什么?

    非常感谢你的帮助。再见: - )

2 个答案:

答案 0 :(得分:5)

通常,域层意味着"实体" (域名模型)和域名服务。

实体拥有与之相关的所有业务逻辑。验证(检查它们是否处于正确状态)和计算通常放在属性设置器/ getter中,而转换数据的操作通过公共方法公开。

域服务是与多个实体一起运行并在实体之间进行一些计算和/或转换的类。

要考虑的一些事项。为了使这种设计正常工作(因此它是可测试的,解耦的等),必须使用依赖注入(DI)。域名不应该被获取或保存数据等所困扰。它应该明确地解耦,并且应该预先知道它的所有依赖性。

如果它是一个简单的应用程序,那么组合域层和数据访问层可能是明智的,因此从ORM创建的对象已经是实体。只需添加域名服务(如果您需要)。然后在演示中使用相同的实体(作为MVC的模型)。这将减少映射器在ORM制作的对象(让我们称之为dbos),实体和演示所需的可能模型之间映射的需要。当然,如果每层需要不同的对象,请务必创建它们。如果不需要,请不要过于复杂。

答案 1 :(得分:1)

其中一种可能性是按如下方式构建应用程序:

1)@Entity注释POJO表示使用JPA表示表格,它们之间的关系等的数据层

2)实现Session Facade desing pattern的无状态会话bean包装容器管理的CRUD操作。每个实体通常有一个外观,它们通常如下所示:

@Stateless
public class FooFacade extends AbstractFacade<Foo>{
    @PersistenceContext
    EntityManager em;

    public EntityManager getEM() {
        return em;
    }

    public void save (Foo entity) {
        getEM.persiste(Foo.class, entity);
    }

    public void reload (Foo entity) {
        getEM.refresh(entity);
    }

    //other similar stuff
}

AbstractFacade是一个抽象类,它提供遗传查找和其他在所有外观类中看起来相同的操作(以避免重复代码)。 This e-commerce sample application可以作为此策略的一个很好的例子。这些类通常被命名为EntityName + Facade。

3)无状态会话bean,可以实现您的业务逻辑(根据您的情况计算竞争对手,或者将商品添加到购物篮中,为电子商务应用程序实施结帐等)。通常它们通过上面第2部分中提到的* Facade EJB与数据层进行通信。 This part of the aforementioned tutorial实现了这些EJB。

4)UI层将引用其请求的Servlet。 Servlet将利用第3部分中的EJB来提供请求。

5)UI层 - JavaFX,Swing,JSF,JSP,Apache Wicket框架 - 添加你喜欢的任何东西。

这种结构为您提供了灵活性和可扩展性。将业务逻辑集中在无状态bean中意味着您可以很好地扩展,因为它们是池化的,并且当应用程序(例如servlet)需要与这样的bean的实例通信时,池中的每个实例都可以同等地使用。

我强烈建议您仔细阅读Netbean网站上的电子商务教程,了解该方案的具体实施。 Here is the download link for the source code of the application,AffableBean电子商务系统,通过教程构建。