如何设计业务逻辑层

时间:2010-11-03 09:51:57

标签: oop architecture n-tier-architecture

非常清楚,我不希望解决这个问题。解决这个问题的很大一部分显然是解决了这个问题。但是,我没有很好的架构n层应用程序的经验,我不想最终得到一个不守规矩的BLL。

在写这篇文章的那一刻,我们的商业逻辑主要是一个混合的缠绕球。具有相同相同业务逻辑的依赖关系的星系间混乱不止一次被复制。我现在关注的是将业务逻辑从我们称为数据访问层的事物中拉出来,以便我可以定义可以订阅的众所周知的事件。我想我想支持事件驱动/反应式编程模型。

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

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

编辑1:

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

6 个答案:

答案 0 :(得分:2)

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

查看以下链接中的示例代码:

http://dddpds.codeplex.com/

如果您愿意,DDD会关注您的域层或BLL,我希望它有所帮助。

答案 1 :(得分:2)

有点广泛的问题。使用ORM技术(可能是NHibernate)将您的数据库与业务逻辑(可怕的术语)分开。这让你大部分(显然)留在OO土地上,从架构的角度来看,你可以大多忽略数据库方面的东西。

接下来,我发现Domain Driven Design(DDD)是将复杂系统分解为可管理块的最成功方法,虽然它不受尊重但我真正找到了UML - 尤其是动作和类图 - 在理解和沟通系统设计方面非常有用。

一般建议:接口所有内容,从一开始就构建单元测试,并学习识别和分离可作为子系统存在的可重用服务组件。 FWIW如果有一大堆你正在研究这个问题,我也会同意并积极地使用stylecop:)

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

看一下这个帖子。可以给你一些想法。

How should my business logic interact with my data layer?

guide from Microsoft也可能有所帮助。

答案 4 :(得分:0)

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

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

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

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

希望有所帮助,虽然我会留下社区维基回应,所以也许你可以得到更多关于这个建议的反馈。

答案 5 :(得分:0)

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

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

有一点需要注意:一些验证规则很容易封装/传输;例如,“姓氏是必填字段”。但是,您的某些验证规则可能过于复杂,涉及的对象太多而无法轻松封装或在元数据中进行描述:“用户只有在不是员工的情况下才能包含该优惠券,并且该订单会在劳动节周末进行,他们在购物车中有2至5种特殊类型的物品,除非他们的购物车中还有这些其他物品,但只有当颜色是我们的“首映销售”颜色之一时,除了等等等等...... “ - 你知道商业'逻辑'是怎样的! ;)

在这些情况下,我通常只接受这样一个事实,即只在业务层进行一些额外的验证,并确保有一种方法可以在发生这些错误时将这些错误传播回UI层(你是无论如何都需要那个通信渠道,无论如何都要报告持久性层错误。