[英]DAO and Service?
我总是面临一个问题,我无法真正想到封装了许多DAO方法的服务对象。
我的意思是,对于我的servlet,有时使用单个DAO方法就足够了,例如addUser(User params)。
更好的做法是 - 使用服务对象封装DAO方法并仅使用服务对象,即使它实际上意味着单个服务方法调用单个dao方法或将它们的使用混合在一起(来自服务对象的一些方法和来自servlet中的dao的一些方法)上下文) - 意味着我在控制器内部自动装配了DAO和Service对象?
如果我开始在同一个地方同时使用DAO和Service对象,它会混淆逻辑吗?
我认为这取决于具体情况。 如果没有DAO会导致混合业务逻辑和数据访问逻辑,那么最好有单独的类。
但是,如果您的DAO是“虚拟”并且只调用EntityManager方法,则可以直接在服务对象中使用它。 我们的想法是让课程具有单一职责 ,并且易于扩展和测试。 你不应该为它创建图层。
如果您想保留可重用的服务层,我可能不会直接从您的控制器使用DAO。 如果DAO没有意义,我宁愿在服务层使用EntityManager(或者你正在使用的任何持久性策略)。
我正在使用一个系统,其中“你不能让控制器与DAO交互!” 设计理念在某一点上被接受,并且为每个组件创建了服务层。 正如您所描述的,大多数服务只是委托给DAO。 我反对这一理念有两个原因。
一个是好老“你不会需要它”。 在您需要之前不要实施某些东西。 只是因为你预见到某种原因需要额外的间接层来做一些额外的逻辑,所以你不确定你是否会需要它。 当你最终需要它时,你可能会发现你的期望与你之前认为的不符。 而且你得到额外的成本,因为现在你必须对两个类进行单元测试而不是一个,并且你需要在两个地方而不是一个地方添加方法并不罕见。
第二个是,到底是什么服务呢? 当我为自己的域建模时,我会尝试用面向对象的术语来思考。 有用户,因此User类是有道理的。 有新闻项,因此NewsItem类是有道理的。 但我甚至不知道UserService应该做什么。 包含用户的“业务逻辑”? 不,这就是User类的用途。
如果你需要为“外部世界”维护一个严格的API,那么我可以看到一个案例,让一个额外的层保持不变。 但在所有其他情况下,你不会需要它。
要看。 分离DAO和服务层的原因通常是:
使用Java EE 6(JBoss AS 7),我没有这些负担:
所以我在DAO层中有大多数方法。 对于某些情况,更复杂的操作,我创建了一个服务bean,并且可能使用扩展的持久化上下文 。
我的经验法则是,方法是否应该进入Service bean:
就个人而言,我通常在服务中封装DAO调用。
这允许我使用AOP /等进行所有服务交易。 并在这些服务中使用非事务性DAO方法。
对于普通服务,这是一个额外的“层”,但IMO服务于一个目的(并且无论如何都可以使用一种或另一种代码生成来生成它)。 这也是罕见的,我只有在服务结束了DAO功能,虽然。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.