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

Hon*_*nza 1 java jsf swing hibernate

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

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

根据Martin Fowler所着的"企业应用程序架构模式"一书,有三个主要层:

  1. 数据源层:我使用Hibernate ORM生成实体,我创建了数据访问对象,以实现更简单的"接口"来获取数据.
  2. 域层: ...
  3. 表示层:我已经创建了Swing GUI和一些带有MVC逻辑的.xhtml页面

如果系统中没有任何"计算",但只有简单的实现和返回数据,我就完成了,一切都好.但是,我是,例如,实施该系统,应该管理体育舞蹈的比赛,并且在比赛期间我需要为每一轮产生一对情侣,在比赛后我需要计算每个舞者的分数,增量必要时点等等.

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

我的结构:

  • hibernate.cfg.xml(hibernate的配置)
  • hibernate.reveng.xml(hibernate的逆向工程文件)
  • isets.dao(包)
    • isets.dao.hibernate(包)
      • HbmCompetitionDao.java(竞争实体的数据访问对象)
      • ...
    • isets.dao.xml(包)
      • ...(另一个实体的数据访问对象,存储为XML)
  • isets.entities(包)
    • Competition.hbm.xml(生成的实体)
    • Competition.java
    • ...
  • isets.util(包)
    • HibernateUtil.java(获取会话工厂对象的文件)

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

非常感谢您的帮助.再见:-)

avi*_*nic 5

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

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

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

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

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