4

我目前正在攻读计算机科学学位的最后一年,并正在完成我的期末项目和论文。我将使用 ASP.NET Web 窗体和 C# 来创建一个 3 层项目 - 我不能真正称它为 3 层,因为它很可能永远不会托管在我本地 PC 以外的任何东西上进行测试,因为它是仅用于单一用途。

我的主要问题是:

根据我的理解,3-Layer 的想法是 BLL 引用 DAL,UI 引用 BLL 以创建完全的关注点分离。然而,我在几个教程之后做了一个小型模拟项目,所以掌握 3-Layer 的窍门,大多数基本教程仍然需要 UI 和 BLL 之间的参考。

例如在我创建的项目中,这是一个非常基本的 Products 和 Categories 类型的电子商务系统,我在 DAL 中创建了 Product 和 ProductDAL 类,然后在 BLL 中创建了 ProductBLL 类。通过这种设置,只使用一个数据库表(暂时忘记类别),BLL 似乎只是作为 UI 和 DAL 之间的一种接口,方法与 DAL 中的方法完全相同,并且只调用 DAL版本。

问题是要通过 BLL 访问 DAL,我必须将 Product 对象传递给 BLL 方法参数,这意味着首先在 UI 中创建 Product 对象,这意味着从 UI 引用 DAL。这是正确的做事方式吗?

我可以通过在 BLL 中创建一个方法来解决这种简单的情况,该方法采用适当的字段(例如字符串和整数)来创建产品对象并将其返回给 AddProduct 方法。但是,在将不同的产品属性绑定到 UI 中的标签时,我仍然需要访问 Product 对象。

所以本质上,我是否需要在 BLL 中加载大量方法来访问产品对象的属性?如果不是,那么实际上什么样的方法会去那里,你能给我一些在这种产品场景中可能进入 BLL 的方法的例子吗?

提前致谢,如果之前有人问过这个问题,我深表歉意——我确实阅读了很多关于 3 层架构的帖子,但大多数都是非常基础的,只能访问一张表。

4

2 回答 2

3

BLL 似乎只是作为 UI 和 DAL 之间的一种接口

这只是因为这个应用程序非常简单——目前只是一个 CRUD 接口。更复杂的应用程序具有将封装在 BLL 中的业务规则(而不是在 UI 或 DAL 中)。

我必须将 Product 对象传递给 BLL 方法参数,这意味着首先在 UI 中创建 Product 对象,这意味着从 UI 引用 DAL。这是正确的做事方式吗?

好吧,这里有几种不同的选择:

  • 您可以拥有一个在不同层之间共享Product的数据访问对象 (DAO) 。此对象不是 DAL 对象,但 DAL 使用它。它被称为DTO - 数据传输对象。
  • 您可以有几个不同的Product对象——一个由 UI 使用,一个由 BLL 使用,一个由 DAL 使用,并且具有映射层以在不同对象之间进行转换。
  • 以上的一些组合。
于 2012-10-28T11:55:34.990 回答
0

分离关注点的一种常见方法是从一个名为 YourProject.Entities 或类似名称的项目开始。这包含主要的类定义,当您需要获得像客户或产品或类似的东西这样的大型实体时,您可以引用它。此外,您还有另一个项目作为存储库。根据您使用的技术,它可以实现类似 EF 的东西来从您的数据库中获取您的对象,或者可以包含直接使用 SQL 或存储过程查询您的数据库的方法。

您必须记住的是,这些项目主要是根据用户输入来运行的。您的用户将采取行动,您的程序将做出响应。这个想法是实际的业务逻辑与你的 UI 和数据访问是分开的。您可以根据需要混合和匹配这些想法,但在我的专业经验中,我倾向于在事物的数据库访问端执行基本的数据约束实施,并且在实体项目中创建对象时直接完成数据验证或在以实体为参数的单独实体验证项目中。

如果您不想拥有单独的验证项目,请记住,您可以使用构造函数和属性直接在对象中实现业务逻辑。构造函数可以在创建对象之前对输入强制执行逻辑,并使用完整的属性——也就是说……

private string myProp    

public string MyProp
{
    get
    {
        // Some code
    }
    set
    {
        // Some code
    }
}

而不是这个...

public string MyProp { get; set; }

允许您在访问与这些属性关联的数据时实施规则。

最后,这些问题可以有多种不同的回答方式,我相信对这个问题的每一次回答都会让你对最佳的做事方式有不同的想法和看法。对我来说,我一直遵循的两条规则是 DRY(不要重复自己)和代码可维护性。通过将逻辑与数据访问与 UI 中的对象设计分离,您将更容易维护和更新您的程序……即使它只是一个学校项目;)。

于 2012-10-28T11:59:29.137 回答