当业务逻辑和数据层似乎重叠时,最佳的设计是什么?

3

我正在构建一个MVC Web应用程序(使用Spring MVC框架),但是在设计特定区域时遇到了一些困难。

该应用程序必须与一系列Web服务进行交互,这些服务的设计并不是很好,并且本身并没有提供太多抽象 - 基本上每个“数据类型”的创建/更新/检索/删除操作都有一个Web服务方法,除此之外就没有太多API了。 Web服务客户端需要知道要调用哪些方法以及以哪个顺序来创建所需的数据 - 换句话说,没有“事务”基础的方法。

例如,仅创建新用户帐户就需要调用总共七个不同的Web服务方法来设置所有必要表中的记录(一个 用户 记录,将正确的 特权 添加到该用户,设置用户的 计费 详细信息等)。

我正在努力找到最佳方法来抽象化并封装它在我们的应用程序中。大部分应用程序都遵循标准流程:

request ---> Controller <---> Service/Business-level object <---> DAOs for data access

在我的应用程序中,我使用自己的“领域对象”来表示和抽象Web服务WSDL中定义的数据类型,以便我的领域逻辑不依赖于Web服务类型,并且我们可以抽象和隐藏任何我们想要的细节。
我正在寻求一些意见,关于设计上述的“用户创建过程”的最佳方式。创建“普通用户”的过程涉及调用七个不同的Web服务,但这只是一种“类型”的用户-我们将必须能够创建几种不同类型的用户,每种类型都需要调用不同的Web服务。
目前,我只设计了这个“普通用户”创建,作为一个概念证明-我有一个领域对象“User”,一个“UserDao”接口,其中包含用于“getUser(name)”和“createUser(User)”的方法,以及一个“WebServiceUserDao”,它实现了“UserDao”方法并知道如何调用上述七个Web服务方法。“createUser()”方法由一个“UserCreationService”调用,这是我的业务/服务级别类,依次由“SignupController”调用。
但为了扩展此逻辑以能够创建不同的用户类型(由中的不同值表示),我不确定在业务/服务层类和DAO之间画出界限的位置。例如,我应该:
1. 为每个“用户类型”创建一个UserDao实现,以便可以将创建每个“用户类型”的逻辑封装在其自己的类中,并让UserCreationService决定使用哪个UserDao?这将对应于1个服务类:多个DAO。
2. 我应该将UserDao拆分成更小的部分,每个部分相应地创建Web服务/ DB中需要创建的每个“记录”,即使我的整个应用程序不需要知道每个这些单独类型之一?然后为各种不同的“用户类型”有不同的UserCreationService实现?换句话说,这种策略将具有PrivilegesDao,BillingPlanDao等,即使我不需要相应的特权或计费计划领域对象。这将是许多服务类:许多DAO。
3. 在一个WebServiceUserDao中包含所有关于每个“用户类型”需要调用哪些Web服务的逻辑?这将有一个非常复杂的类(PMD已经在抱怨圆形复杂度),但是所有这些逻辑都将封装在一个类中,从总体API角度来看,这可能导致较少的复杂性。
我在这个应用程序中的一个目标是确保如果我们需要更改数据持久性的详细信息,那么我们只需要更改DAO实现 - 如果我们必须开始与不同的计费系统进行接口,我不希望应用程序的任何部分发生变化,除了DAO级别。

有什么意见吗?当业务逻辑与数据访问逻辑似乎重叠时,您使用哪种策略来决定何时拆分它们?

2个回答

7
当业务逻辑和数据访问逻辑看起来重叠时,你是如何决定在哪里划分“业务逻辑”和“数据访问逻辑”的策略呢?
也许你可以使用三层而不是两层:“多一层间接”。
在顶层,你可能有业务逻辑,它不知道数据访问:这个业务层使用类如User、Account等,可能还有一些工厂方法如User.getAccounts和Account.getOwners。
底层可能是一个数据访问层,它是你的数据层的包装器或门面。
在这两个层之间,有一个层知道你的业务对象是什么(例如User和Account),但不知道你的业务逻辑是什么。中间层知道你的数据访问层。中间层的工作是使用你的数据访问层API来输入/输出你的业务对象。

0

我不确定在业务/服务层类和DAO之间划分界限的位置。

我们都不确定吧?

我建议使用ORM(iBatisHibernateToplink等)。 不要自己实现DAO。


1
这里的问题是我们“应该”与Web服务层进行接口,而不是绕过它直接访问数据库。有没有可以处理Web服务的ORM?附言:我讨厌Web服务。 - matt b
@matt b:你的草图展示了“业务级对象<---> DAOs”。你是在说这个草图不完整吗?请更新草图,展示真实情况,包括你的Web服务层。 - S.Lott
1
DAO与Web服务进行通信。DAO只是一种模式 - 一个检索另一个对象的对象 - 因此它们连接到SQL数据库和Web服务同样有效。 - matt b

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接