如何设计业务逻辑层

Posted

技术标签:

【中文标题】如何设计业务逻辑层【英文标题】:How to design a business logic layer 【发布时间】:2010-11-03 09:51:56 【问题描述】:

明确地说,我不希望解决这个问题。弄清楚这一点的很大一部分显然是解决问题。但是,我在架构良好的 n 层应用程序方面没有很多经验,我不想最终得到一个不守规矩的 BLL。

在撰写本文时,我们的业务逻辑在很大程度上是一个混合的麻线球。具有相同业务逻辑的星系间混乱的依赖关系被多次复制。我现在的重点是将业务逻辑从我们称为数据访问层的东西中提取出来,这样我就可以定义可以订阅的众所周知的事件。我想我想支持事件驱动/反应式编程模型。

我希望有一些可实现的目标告诉我如何以非常适合业务逻辑的方式设计这些类集合。如果有一些东西可以区分好 BLL 和坏 BLL,我想听听更多关于它们的信息。

作为一名经验丰富的程序员但相当谦虚的架构师,我向社区成员寻求建议。

编辑 1:

所以验证逻辑进入业务对象,但这意味着业务对象需要将验证错误/逻辑传达回 GUI。这让我想到将业务操作实现为对象而不是对象,以提供更多关于操作必要性的元数据。我不是代码克隆的忠实粉丝。

【问题讨论】:

在我的回答中,生成了代码,尽管这不是严格要求的。只是很多逻辑是重复的,尽管以这种方式组织的优点是知道代码更改会进入 BS 文件(或者如果那里有问题,则每个 DL 都会发生变化)。 验证逻辑无处不在恕我直言。 您可以使用业务层中定义的特殊异常类向 UI 传达任何验证错误。 @Andres,作为交流方式的例外......不确定那个。它们用于异常行为,验证错误几乎不例外。 我希望我能投票更多。 【参考方案1】:

有点宽泛的问题。使用 ORM 技术(也许是 NHibernate?)将您的数据库与业务逻辑(可怕的术语)分开。这让您主要(显然)停留在 OO 领域,并且从架构的角度来看,您几乎可以忽略 DB 方面。

继续前进,我发现领域驱动设计 (DDD) 是将复杂系统分解为可管理块的最成功方法,尽管它没有得到尊重,但我确实发现 UML(尤其是动作图和类图)是在理解和交流系统设计方面非常有用。

一般建议:连接一切,从一开始就构建单元测试,并学会识别和分离可以作为子系统存在的可重用服务组件。 FWIW,如果你们中有很多人在做这件事,我也会同意并从一开始就积极使用 stylecop :)

【讨论】:

确实是一个宽泛的问题,但是,BLL 真的是这个未定义的东西吗? 更多的是它有大量的定义。这就像试图问某人什么是合适的车。 但还不止这些。我确实理解“这取决于”,但我们追求解耦和分层架构是有原因的,我只是想弄清楚 BLL 为什么以及如何有意义。 (续)我意识到这是一个非答案,但没有一个正确的答案。 FWIW,我个人相信关注点分离和正确性原则,而 DDD 是实现这一点的一种方式。您想要解耦和分层的原因是因为您这样做的次数越多,更改整个系统中的功能就越容易,而不会造成大量的开发和测试负担因为软件永远不会完成并且总是会发生变化。一切都与变更控制有关,这是现代发展的大写。 欢迎来到战争 - 管理层永远不会理解或欣赏你做的事情不会直接让他们赚钱,如果你做得足够好,他们可能会让你变得多余:)跨度> 【参考方案2】:

在将复杂的业务逻辑拆分为更易于管理/可测试的块时,我发现领域驱动设计的一些实践非常出色。

通过以下链接查看示例代码:

http://dddpds.codeplex.com/

如果您愿意,DDD 专注于您的域层或 BLL,希望对您有所帮助。

【讨论】:

【参考方案3】:

我们只是从架构的角度来讨论这个问题,它的主旨仍然是“抽象、抽象、抽象”。

您可以使用EBC 进行自上而下的设计并将接口定义传递给程序员团队。使用这样的方法(或任何其他可视化技术)可视化依赖关系可以防止您在项目中的任何位置复制业务逻辑。

【讨论】:

这很有趣,我不知道 EBC。绝对值得探索。我不确定其中有多少是直接适用的,无论哪种方式我都可以从中学习。谢谢。【参考方案4】:

嗯,我可以告诉你我们用于一个相当大的以数据库为中心的应用程序的技术。我们有一个类按照您的建议管理数据层,它具有后缀 DL。我们有一个程序可以自动生成这个源文件(这很方便),但这也意味着如果我们想扩展功能,你需要派生类,因为在重新生成源时你会覆盖它。

我们有另一个以 OBJ 结尾的文件,它简单地定义了由数据层处理的实际数据库行。

最后但并非最不重要的一点是,对于格式良好的基类,有一个以 BS(代表业务逻辑)结尾的文件作为唯一没有自动生成的文件,它定义了事件方法,例如“新建”和“保存”,这样通过调用基础,完成了默认操作。因此,任何与规范的偏差都可以在此文件中处理(包括在必要时完全重写默认功能)。

您应该为每个表及其从该主表派生的子(或孙)表创建一组此类文件。您还需要一个包含所有对象全名的工厂,以便可以通过反射创建任何对象。因此,要修补程序,您只需从基本功能派生并更新数据库中的一行,以便工厂创建该对象而不是默认对象。

希望对您有所帮助,不过我会将此作为社区 wiki 回复,以便您可以就此建议获得更多反馈。

【讨论】:

【参考方案5】:

看看这个帖子。可能会给你一些想法。

How should my business logic interact with my data layer?

这个guide from Microsoft 也可能会有所帮助。

【讨论】:

【参考方案6】:

关于“编辑 1” - 我已经多次遇到过这个问题。我完全同意你的看法:必须在多个地方进行相同的验证。

我过去解决它的方法是以某种方式封装验证规则。元数据/XML,单独的对象,等等。只要确保它是可以从业务对象请求的东西,带到其他地方并在那里执行。这样,您只需编写一次验证代码,即可由您的业务对象或 UI 对象执行,甚至可能由您的代码的第三方使用者执行。

有一个警告:一些验证规则很容易封装/传输;例如,“姓氏是必填字段”。但是,您的某些验证规则可能过于复杂,涉及的对象太多,难以在元数据中轻松封装或描述:“只有不是员工的用户才能包含该优惠券,并且订单是在劳动节周末下达的,并且他们的购物车中有 2 到 5 件这种特定类型的物品,除非他们的购物车中也有这些其他物品,但前提是颜色是我们的“首发销售”颜色之一,除了等等等等…… .” - 你知道商业‘逻辑’是怎样的! ;)

在这些情况下,我通常只接受仅在业务层完成一些额外验证的事实,并确保当这些错误发生时有办法将它们传播回 UI 层(您是无论如何都需要该通信通道,以报告持久层错误)。

【讨论】:

以上是关于如何设计业务逻辑层的主要内容,如果未能解决你的问题,请参考以下文章

系统架构师-基础到企业应用架构-业务逻辑层

三层架构之业务层逻辑层

业务逻辑层

PetShop之业务逻辑层设计 - 《解剖PetShop》系列之五

三层架构之业务逻辑层

打破业务逻辑和数据层似乎重叠的最佳设计? [关闭]