2013-04-25 33 views
8

我们有3个分层的应用程序,其中每个来自服务层的调用都通过数据层进入业务层和peresist。 每层的组件只能调用下面的图层;在多层体系结构中,我是否可以跳过业务层以实现crud操作?

但是,因为我们有数百个实体,并且我们有很多与crud operatins相关的服务,所以我们团队中提出了许多内容。

一些人认为,为了维护和易于开发,最好从粗劣服务调用数据访问,这些服务只是在进行粗劣操作并绕过业务层。

相反,有些人说我们必须为业务层中的每个实体的数据访问创建包装,并从服务调用这些包装,并且绝不允许服务调用数据访问层。

在你的想法中我们应该采取哪种方式? crud服务可以调用数据访问并绕过业务层吗?

回答

5

如果没有业务逻辑可执行,则没有理由执行业务层。三层体系结构不是一个神秘的协议,只是业务处理过程中形成的最佳实践。

在当前的应用程序中,我们经常在没有涉及业务流程的情况下直接从JSF控制器访问DAO。这个想法是由java champion给出的,他强调了简单性至关重要的观点。

如果您担心未来可能需要添加业务逻辑的修改。我这样思考问题:无论如何,额外的业务逻辑将被添加到业务层,包括数据访问,所以这里没有区别。

CRUD代码大多非常简单。因此,服务中的更改将等于将DAO中的一个调用或几个调用重新路由到一个EJB - 这是一个简单的重构。 CRUD代码本身仍然存在,但会被推入到EJB中 - 另一个简单的重构。

这并不完美,但IMO更好,然后替代方案:有一个空的间接层。这增加了无用的复杂性。业务对象只会将呼叫转发给DAO。

有两个code smells,我认为适用于这种情况:人为的复杂性和feature envy

我不是说业务层中的DA是某种代码味道。我的意思是有一个没有别的的业务对象,但代理DAO是一种气味。这与复杂性相同 - 一个没有自己的目的的增加的数据结构/架构层 - 似乎应用程序中已经有了DAL。

您考虑的另一方面是 - 开发人员看到直接使用DAO的服务有多令人惊讶?有5个服务,其中2个直接访问DAO不同于100个服务,其中只有一个服务直接访问DAO。在第一种情况下,代码的简单性将超过增加的概念复杂性(2个概念对于单一事物),在第二种情况下,我宁愿坚持业务层 - 惊喜(也称为WTF效应; )以不同的方式做一次就太大了。

+2

和往常一样,晶莹剔透!虽然这个问题在ins性质上是自相矛盾的('我怎么总是跳过依赖它的应用程序中的中间层')。 – skuntsel 2013-04-25 10:57:55

+1

@skuntsel - 谢谢:)是啊,如果DAO被认为是业务层的一部分,那么你就用3层固定 - 对我来说DAO是DAL的一部分,所以我失去了一层廉价的口头语言诀窍;) – kostja 2013-04-25 12:09:06

+0

如果在一段时间后你必须在做CRUD操作之前添加一些业务呢?如果您在Service层中添加业务代码的方式是错误的,因为服务不应该有业务代码,所以您必须在业务层中添加业务,更改服务以获得业务并完成其工作,因此您必须更改2个不同的地点以添加商业。这是我相信的问题! – 2013-04-25 13:36:27

3

在我看来,呼叫CRUD服务绕过业务层将开始将当前服务层转换为业务层,同时增加功能。所以你的服务层也会充当业务层,如果你没有问题的话。

在大多数情况下,您处理一个实体,可能涉及到多个数据层crud调用,例如一次更新。为此推荐业务层。业务层是执行任何业务规则,缓存或调用其他业务服务的地方。这将保持上层简单并通过。

+0

我主要关心的是不允许服务层成为业务层。除了@kostja之外,我认为它的权利“拥有一个除了代理DAO之外别无他物的商业对象就是一种气味。如果你需要采取一种你会采取哪种方法,我真的对你的决定感兴趣?在业务层中代理doa或从服务层调用dao? – 2013-04-26 08:48:26

+0

如果您认为除了现在或将来调用crud操作之外,您可能还想做其他任何事情,我强烈支持通过业务层。这决定了稍后需要做多少代码或重构。如果您认为这是一个遥远的可能性,那么只需使用DAO而无需任何代理。只有你可以判断。 – techuser 2013-04-26 16:26:38

+0

因此,您可以在crud Operations中跳过业务层。因此你说为了简单而刺穿应用程序设计不是问题?不过,我的经验表明,如果我从服务层的项目中删除DA引用,开发人员的代码就会更清晰,让他们能够访问服务层中的DA!他们可能会滥用ServiceLayer中的访问和混合业务!你不这么认为吗? – 2013-04-29 11:20:19

1

我不会绕过业务层。即使它看起来像只是将DAL的调用代理到BL中,并且即使这可能是非常简单的CRUD操作的情况,BL也可以封装操作所需的验证逻辑。验证逻辑可以在BL上执行,并且只有验证条件满足时才会执行代理到DAL。

+0

如果你的图层和层是相应的,那么值得你打电话给3个独立的过程进行简单的粗暴操作? – 2013-10-24 07:41:25

相关问题