2013-06-06 56 views
1

我曾经在我的DAL中为每个DataTable创建一个BLL类。 努力遵循OOP原则我分成每个班两个班如下:OOP和DB访问

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

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

    1. 领域的MULTILINE_ACL_COMPONENT
    2. 构造 - 访问数据库,以填补的MULTILINE_ACL_COMPONENT
    3. 的GetList方法 - 收益的MULTILINE_ACL_COMPONENT

我的问题:
1.你可以看到,Item类不包含任何插入方法,因为我无法确定它应该是哪一个类。
2.可以在Item中返回一个Item的Get方法。
3.可以在Items类中使用Update和Delete方法来从items_list中检索Item,然后调用Item的相应方法。

谢谢。

回答

1

您将受益于阅读ORMrepository pattern。一旦你选择一种语言,你就可以使用特定的技术,例如在C#中有NHibernate,Entity Framework,通用的存储库模式非常流行。

正如您所看到的,Item类不包含任何插入方法,因为我无法确定它应该是哪一个类。

域类不包括任何数据访问层的东西。将它们分开,因为这些是不同的责任。看看SOLID principlesDomain Driven Design

可以在通过ID返回项目的项目中有Get方法。

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

可以在Items类中使用Update和Delete方法来检索Item_list中的Item,然后调用Item的相应方法。

没有,同样的理由在其他的。

总之,一个班级 - 一个责任。与数据库交互分离模型。使用单独的泛型类与数据库交互,使用ORM。看看有关这些模式和技术的教程。

+0

通过数据库访问我的意思是从DAL调用方法,而不是实际连接到数据库。所有类方法(获取,更新,删除,插入)仅使用DAL中的相应方法。 –

0

不幸的是,对这三个问题的答案是“不”。我认为,正如Oleksii在他的回答中解释的那样,你在同一类别中混合了不同的责任。 一个班级应该只有一个责任(Single Responsibility Principle)

  • Item应该代表一个记录的数据,所以它应该被限制到它的属性。
  • Items应代表一个记录集,一个Item(你可能会迭代)的集合。因此,查询后你应该得到什么。

应该有至少第三类,称之为DAO(数据接取对象)或管理器负责执行DB操作,如GetGetListUpdateDeleteInsert的。

+0

这就是我想解释的。我有一个包含DataTables和DataTableAdapter的DAL。项目和项目是BLL中使用DAL中的数据库操作的类。 –

+0

@YevgeniGrinberg您直接访问数据库的事实并不重要。我说的不依赖于层。问题是你在混合责任。在这里我看到代表信息本身并处理它的类。您应该将其分开,以便让表示信息的类和对其执行操作的类进行分类。 –

+0

我不明白它的目的。为什么只有一个类只有属性和没有函数,另一个类只有函数和没有属性?这个班不是应该代表一个对象和所有关于它的操作吗? –