处理数据库数据的良好面向对象设计原则

5
我觉得我正在问一个相当基本的问题,我认为我应该能够在互联网上找到一个好的答案。但是我已经搜了很久,只找到了一些干巴巴的答案。更糟的是,我现在担心这个问题可能太主观了 :)
无论如何,下面是问题。在面向对象程序中访问、处理和操作关系数据库数据的良好实践是什么?在我的编程中,我一直以过程方式处理数据库数据。我目前正在积极尝试改善我的OOP习惯,我不确定如何处理这个问题。
这是我正在处理的其中一个场景。我有一个包含许多制造工作条目的表。我正在编写(改进)的应用程序对每个作业执行大量处理。例如,我遍历表中的每一行并执行以下操作:
- 将截止日期发布到Google日历 - 在给定目录中创建一个唯一的作业文件夹 - 为作业创建工单 - 为作业创建合同简介 - 管理旅行者文档 - 向几个人发送电子邮件 - 等等,列表继续
你明白了。对每个工作都要进行大量处理。目前,我拥有大多数优秀程序员所称的精彩代码堆。也许它不是那么糟糕,但几乎是。我使用for each循环遍历表中的每一行,并按顺序对每一行执行每个操作。我不喜欢目前的设计方式,但我不知道如何更好地处理这个问题。
我希望如果我可以有一个整洁的名为“Jobs”的对象,该对象将实现作业的所有属性并提供执行每个操作的方法。然后我甚至可以制作一个自定义集合来处理我的工作,所有事情都会更加明亮。整个解决方案将更易读、更易维护、更易添加要在每个工作上执行的操作(这经常发生)等等。
但我的问题是我无法弄清楚高级对象和数据库之间的连接。我应该使用某种对象关系映射(我读到了各种各样的混合意见)吗?我只是遍历所有行并将它们转换为对象,这些对象积累在集合中?还是继续以过程方式进行此类项目是最佳选择?我希望得到您的答案和建议。
我对这个主题的信息感兴趣。换句话说,我想知道如何在一般情况下处理这种情况。不仅限于我提出的例子。当然,具体细节也很重要。我在Visual Basic和C#中使用VS 2010进行大部分编程。

很遗憾,抽象的、泛化的问题并不适合于Stack Overflow的格式。请快速查看网站FAQ以了解您可以在此处提出哪些问题。 - Andrew Barber
1
你应该尝试使用NHibernate或Entity Framework,然后形成自己的观点。无论如何,为了从数据访问层中访问数据,我强烈建议在DAL和业务层之间使用一个仓储模式。 - Guillaume
有时候你会很幸运,有些耐心的人在 :) - Andrew Barber
@AndrewBarber 是的,我知道。当我认为一个问题可能太笼统时,我从来不知道该怎么做。我理解这个问题,但是StackExchange上的人们非常专业,这让人更加想问:) - ThinkerIV
2个回答

4
看看仓储模式。这是一种将数据访问与业务处理以有意义的方式分离的好方法。应用此模式,我有几个项目:
  • 实体 - 存储内容的对象
  • 数据访问 - ORM DbContext 和 ADO.NET 包装器
  • 仓库 - 封装查询以向应用程序的其余部分呈现强类型函数
  • 其他 - 其他项目/层:业务、GUI 等
请参见如何使用依赖注入的 Entity Framework 上下文?了解每个项目类型的良好描述。

感谢您指引我使用仓储模式。从我目前的阅读来看,这似乎是我需要的处理方式。 - ThinkerIV
+1 依赖注入!@ThinkerIV DI 在解决混乱代码方面会有很大帮助。我想添加一些建议:要了解层和分层之间的区别,以免混淆两者。即使只有一个层,我建议始终至少使用三个层。在编写业务层时,尽量保持其无状态性。使用数据访问对象将数据发送和接收到业务层,而不是具有数据和功能的业务对象。 - Steven Doggart
这个视频中的评论时间代码是多少?有人认为你的ORM已经足够作为“Repository”层,但是请记住微软经常更改他们的ORM / 数据访问策略。(记得类型化数据集吗?)如果你的存储库抽象掉了ORM,并且你的实体对象只是C#对象,那么当MS改变他们的想法时就容易得多。 - robrich
当微软改变他们的想法时,您需要在DataAccess项目中清除ORM代码,修改每个存储库内的方法,但应用程序的其余部分不会改变。如果您没有这个存储库层,则现在实例化DbContext的任何内容也需要更改。我可以理解“不要为简单的事情创建象牙塔”的观点-这是一个非常有效的论点。它完全取决于您的应用程序规模和您愿意维护的内容。我不喜欢“服务”层,因为它大致重复了控制器。只有在您拥有多个GUI客户端时才是真正合适的。 - robrich

1
但我的问题是我不知道如何在花哨的对象和数据库之间建立连接。我应该使用某种对象关系映射(我读到了各种各样的混合意见)吗?
是的。
至于处理。使用访问者模式,让所有想要处理数据的不同代码将自己注册为访问者。您还可以使用控制反转容器来管理它(IHandlerOf<Job>IHandlerOf<TravelerDocument>)。
这为您提供了一种更松散耦合的处理数据方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接