11

我有一个问题,我只是觉得我没有找到令人满意的答案,或者我没有找到正确的地方。

我们的系统最初是使用 .NET 1.1 构建的(但是现在所有项目都支持 3.5),并且所有实体都使用存储过程和具有标准 ExecuteReader、ExecutreNonQuery 类型方法的“SQLHelper”持久化到数据库中。

所以通常发生的情况是我们将拥有我们的实体,例如 User 和 Role,我们将拥有另一个名为 UserIO 的类,它使用以下方法将这些对象持久化到数据库中:

 static UserIO.SaveUser(User user)

单独的 IO 文件的原因是使 IO 与实体分开,但是仅仅调用不是更令人满意吗?:

User.Save()

也许我错了,但将这些“IO”文件分散在各处感觉不对。所以我正在考虑寻找其他持久性选项,我想知道从哪里开始最好。我过去使用过数据集,但有一些复杂的经验,尤其是它们的性能。我知道 LINQ 现在已经存在,但我听说我应该使用 ADO.NET Entity Framework 而不是 LINQ,但后来有人告诉我 Entity Framework 不太正确,我应该等待 C# 4.0。如果是这种情况,并且 C# 4.0 即将到来,我是否应该继续我的“IO”文件方法,并在 C# 4.0 最终发布时从实体框架开始。或者我可以使用更优雅的类结构,例如利用部分类?

我应该说,我并没有考虑完全替换已经存在的数据访问,我更关心我正在创建的新实体。

如果这个问题有点笼统,我很抱歉,但是我周围没有很多人可以反弹这种想法。

4

5 回答 5

4

我已经成功使用了 Entity Framework 3.5。有些人,我认为他们是纯粹主义者,他们认为 Entity Framework 违反了某些规则,不应该使用。

在我看来,唯一重要的规则是你自己的。我建议您开始尝试使用 Entity Framework 3.5,因为您现在拥有它。此外,您(以及几乎所有其他人)需要尽快开始试验 .NET 4.0。Release Candidate 是免费提供的,因此没有理由不知道有什么可用。

您可能会发现自己非常喜欢 4.0 中的 EF 更改,以至于您想要等待它。就像 3.5 中一样,您可能不需要等待,并且可以继续从 EF 中受益。我有,我很高兴我没有等到。

于 2010-03-04T18:53:35.357 回答
3

如果您正在寻找对象关系映射模型,您可以查看:

这里还有一个更长的列表:http ://en.wikipedia.org/wiki/List_of_object-relational_mapping_software#.NET

至于如何为持久性设计对象模型的一般问题,设计选择很大程度上取决于系统的复杂性、您需要的可扩展性、是否需要支持多个持久性存储(SQLServer、Oracle、文件系统等) ), 等等。您描述的模式看起来像DataTansferObject (DTO)。这是将持久性逻辑与业务逻辑分离的常见设计。

顺便说一句,良好系统设计的一般原则是单一职责原则在构建系统时,您必须决定将不同的职责组合到一个类中是否有意义。结合职责通常会使系统复杂化并产生难以解决的设计冲突。

于 2010-03-04T18:48:45.997 回答
2

我经常使用的模式是:每个对象都有以下内容:

  • 数据传输对象 (DTO) - 这使数据集使用的内存尽可能小。
  • 业务对象 - 至少将上述 DTO 作为构造函数 - 这将在 DTO 上执行任何不是 CRUD 函数的函数
  • 存储库类中的 CRUD / 持久方法

后者可以通过两种方式之一完成。您可以拥有一个大的存储库类,这对于只有几个对象的应用程序/组件来说很好,或者您可以为每个对象拥有单独的存储库。

看看 Rudy Lacovaras 博客。他最近发表了一系列关于使用类似模式进行高效数据访问的文章。

于 2010-03-04T19:24:32.483 回答
0

拥有独立于模型的存储库是一种常见模式。对于这种模式,名称 IO 是唯一的,但有效。现在取决于您与谁交谈(想到 TDD 疯子),您可能会因为使用静态类而感到沮丧。

于 2010-03-04T18:47:50.570 回答
0

拥有一组实现数据功能的类通常称为分层编程。(http://en.wikipedia.org/wiki/N-tier)。通过分离访问数据层的类,您可以创建一个更易于维护的系统。如果您将这些功能合并到在应用程序中实现业务规则的类中,您将失去多层设计的许多优势。

将数据访问函数分配到它们自己的类中是好的(为设计者喝彩 3 次),但是将它们分布在整个地方是不好的。理想情况下,您不会将这些函数的来源都放在同一个目录或文件中(取决于项目大小)。如果它们都在一起,您将获得许多优势。将它们分成(随机?)许多位置违背了模块化此代码的目的。

于 2010-03-04T18:55:37.000 回答