【问题标题】:What is the difference between a business object and business logic业务对象和业务逻辑有什么区别
【发布时间】:2012-03-19 11:45:18
【问题描述】:

我正在尝试根据最佳实践来构建我的 WPF MVVM 应用程序。我必须从大量现有代码开始,因此无法立即解决所有结构缺陷。我喜欢下面的解决方案结构。

http://www.paulspatterson.com/technology/dot-net-development/mvvm-and-wpf-for-vb-net-series-2-part-1-again/

这将解决方案分为以下项目; BusinessLogic、BusinessObjects、基础设施(通用可重用实用程序)、WPF Shell 和模块(使用 IOC 容器注入的应用程序组件)。

我了解业务对象代表人类世界实体,而业务逻辑是本问题中讨论的实现细节。

What are Business Objects and what is Business Logic?

因此,使用 MVVM 业务对象是否只是成为一个愚蠢的容器,除了等待其属性被外部业务逻辑更改之外实际上什么都不做?我看不到您如何将业务对象与业务逻辑分离到能够将它们放在单独的程序集中的地步。

采用以下大大简化的代码:

public class Chart
{

    private SizeChart _activeChartSize = new SizeChart();

    public void Draw() {
        //  Size the chart object
        _activeChartSize.Size(this);
        //  Do other draw related things
    }

}

public class SizeChart
{

    public void Size(Chart chartToSize) {
        //  Manipulate the chart object size
    }

}

在上述 MVVM 解决方案结构的上下文中(至少在我看来),SizeChart 类将是业务逻辑,而 Chart 类将是一个业务对象,但将它们放在不同的项目中将是一种循环依赖。 SizeChart 类是业务逻辑还是业务对象?如果我采用这个提议的 MVVM 解决方案结构,SizeChart 类应该驻留在解决方案结构中的什么位置?

如果这对某些人来说是一个非常明显和简单的问题,我们深表歉意,但是当您无法从头开始时,很难知道如何最好地开始将结构不佳的代码转换为结构良好的代码。

【问题讨论】:

  • 我认为将业务逻辑与其对象分离不是一个好主意,因为这会导致anemic domain model

标签: c# mvvm


【解决方案1】:

http://en.wikipedia.org/wiki/Business_object

业务对象一种可理解的实体,是面向对象计算机程序的 n 层架构中业务层内的参与者。 虽然程序可以实现类,这些类通常以对象管理或执行行为结束,但业务对象本身通常什么都不做,它持有一组实例变量或属性,也称为属性,以及与其他业务对象的关联,编织一个映射代表业务关系的对象。

http://en.wikipedia.org/wiki/Business_logic_layer

业务逻辑层业务逻辑层 (BLL),也称为领域层,是一种划分的软件工程实践。 在 BLL 内,对象可以进一步划分为业务流程(业务活动)和业务实体。业务流程对象通常实现控制器模式,即它们不包含数据元素,但具有协调业务实体之间交互的方法。

因此,基本上,业务对象对实体(通常是真实世界的对象,例如员工或帐户)进行建模,而业务逻辑促进业务对象之间以及其他应用程序层之间的交互。

我认为最合适的答案是Daniel Hilgarth。他的回答是不要将业务逻辑与其对象分开,因为这会导致anemic domain model

虽然我认为 Paul S Patterson 提出的以下 WPF MVVM 解决方案结构很好,但我认为它并不适合所有人。

http://www.paulspatterson.com/technology/dot-net-development/mvvm-and-wpf-for-vb-net-series-2-part-1-again/

如果您的业务对象是Data Transfer Objects (DTOs),则创建不同的业务逻辑和业务对象项目可能效果最好。 Linq to SQL 而不是更复杂的对象,例如可能与业务逻辑具有更紧密耦合的组合。

【讨论】:

    【解决方案2】:

    业务对象是一个相当模糊的术语——它是一个 DTO、一个 POCO,还是与一些业务逻辑相结合的?

    对我来说,我会考虑一些不同的东西 - ChartSizeChart 都是控件,而不是“业务对象”或“业务逻辑”。并不是他们在其中有 UI 听起来的函数名称,而是他们实际上在做 UI 或渲染相关工作(调整大小和绘图)。这些使用的数据集合将是独立的,并会在调用 SizeDraw 之前分配给控件。

    请注意,这个答案与 MVVM 无关,因为它有点牵强附会 - 您的问题与您还包含 MVVM 的一般 n 层设计更密切相关。

    【讨论】:

    • 感谢您的回答。 Chart 是一个 POCO,特别是 Interop.Excel.Chart 的抽象。我同意一般的 n 层设计评论,尽管术语看起来如此含糊,知道在这种情况下我专门指的是 WPF MVVM 并没有什么坏处。我明白你所说的关于控制的内容。在没有看到应用程序的情况下,我怀疑任何人都无法说出解决方案结构方面的控制应该放在哪里,但也许您可以描述您的解决方案结构的最佳实践?
    【解决方案3】:

    我最近在一个项目中遇到了类似的事情。

    我们有一个允许管理员创建组的网络应用程序。需要的规则之一是您不能创建两个同名的组。我们最终做的是创建一个非常基本的对象,一个 Group,然后创建一个名为 GroupService 的服务。 GroupService 进行规则检查,以便当用户调用 GroupService.Save(Group) 时,该服务会退出并检查具有该名称的先前组。如果找到该名称,则会向用户返回一个错误,并且不会进行保存。

    在我们的例子中,层次结构是控制器有服务,服务有存储库,存储库最终提交到数据库。贯穿这些抽象的每一个都是模型,组。但我们的模型不仅仅是一个“愚蠢”的对象。它确实包含数据字段本身的验证逻辑,并具有简化数据绑定的聚合属性。

    将此扩展到 MVVM 概念,我认为 View Model 将拥有包含业务逻辑的服务和一个将被合并到 View 中的模型。显然 View 会绑定到 ViewModel,但是 ViewModel 会有一些 Model 对象的实例要绑定到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-07
      • 2011-03-17
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      • 2011-08-01
      • 1970-01-01
      相关资源
      最近更新 更多