我知道有很多关于我的问题的问题,我已经阅读了很多,但我仍然觉得有点愚蠢,因为我还没有得到它。所以我在我的特定问题上尝试它。
我正在实施学校的工作。它应该是信息系统的一部分,必须是分层的。我们必须用Java或C#编写它(我选择了Java)。在我的例子中,我们必须使用两个不同的数据源和两个不同的视图,oracle db和xml作为数据源,Java Swing和JSF作为视图。
根据Martin Fowler撰写的#34;企业应用程序架构模式"有三个主要层:
如果没有任何"计算"在系统中,但只有简单的实现和返回数据,我完成了,一切都很好。但是我,例如,实施系统,应该管理体育舞蹈的比赛,在比赛期间我需要为每一轮产生一对情侣,比赛结束后我需要计算每个舞者的分数,必要时增加点数等等。
我知道,这是Domain层(业务逻辑)的责任,但我的代码在哪里?我应该选择这些对象的名称以及将它们放在我的代码结构中的位置?
我的结构:
我应该在哪里设置我的业务逻辑以及这些类的名称应该是什么?
非常感谢你的帮助。再见: - )
答案 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电子商务系统,通过教程构建。