1

我曾经为我的 DAL 中的每个 DataTable 设置一个 BLL 类。为了遵循 OOP 原则,我将每个类分为以下两个类:

  • 类 Item - 表示单个项目/行。包括:

    1. 字段和属性根据表的字段。
    2. 构造函数 - 他们不访问数据库
    3. 静态 Get 方法 - 从 DB 返回单个项目。
    4. Delete 方法 - 从数据库中删除一个项目。
    5. 更新方法 - 更新数据库中的项目。
  • 类 Items - 表示 Item 类的对象的排序列表。键是项目的 ID。包括:

    1. SortedList 类型的字段 items_list
    2. 构造函数 - 访问数据库以填充 items_list
    3. GetList 方法 - 返回 items_list

我的问题:
1. 如您所见,Item 类不包含任何插入方法,因为我无法决定它应该在哪个类中。
2. 是否可以在 Items 中有一个 Get 方法,该方法将通过其 ID 返回一个 Item。
3. Items 类中有Update 和Delete 方法是否可以,从items_list 中检索一个Item,然后调用Item 的相应方法。

谢谢你。

4

2 回答 2

1

您将从阅读ORM存储库模式中受益。一旦你选择了一种语言,你就可以为此使用特定的技术,例如在 C# 中有 NHibernate、实体框架、通用存储库模式非常流行。

如您所见,Item 类不包含任何插入方法,因为我无法确定它应该在哪个类中。

域类不应包含任何数据访问层的东西。将其分开,因为这些是不同的职责。看看SOLID 原则领域驱动设计

是否可以在 Items 中有一个 Get 方法,该方法将通过其 ID 返回一个 Item。

不,不行。从域模型类中删除任何数据访问成员。

是否可以在 Items 类中有 Update 和 Delete 方法,从 items_list 中检索 Item,然后调用 Item 的相应方法。

不,与其他原因相同。

简而言之,一类 - 一项责任。将模型与数据库交互分开。使用单独的泛型类与数据库交互,使用 ORM。查看有关该模式和技术的几个教程。

于 2013-06-06T09:33:26.780 回答
0

不幸的是,这三个问题的答案是“不”。我认为正如 oleksii 在他的回答中所解释的那样,您在同一类中混合了不同的职责。一个类应该只有一个职责(单一职责原则)

  • Item应该代表一个记录的数据,因此它应该仅限于它的属性。
  • Items应该代表一个记录集,一个项目的集合(......你可能会迭代)。因此,查询后您应该得到什么。

至少应该有第三个类,称为 DAO(数据访问对象)或负责执行 DB 操作的管理器,例如GetGetList、和。UpdateDeleteInsert

于 2013-06-06T14:27:05.447 回答