c# - 我不明白持久独立性的意义

标签 c#

<分区>

Possible Duplicate:
What are the benefits of Persistence Ignorance?

在尝试找出 Entity Framework 一段时间并提出一些问题后,我得出的结论是我只是不明白持久性无知对象的意义所在。

据我所知,使用持久性感知对象和持久性无知对象之间的实际区别在于,一个人会使用类似

Person p = Person.Load(id);
p.Active = false;
p.Save();

另一个是按照

using (var context = new MyContext())
{
   Person p = context.Persons.Single(x => x.ID == id);
   p.Active = false;
   context.SaveChanges();
}

在第一种情况下,我可以返回 p,并在稍后调用 Save()。在后者中,我可以返回 p,但我需要将它放入新的 MyContext() 中以保存它。在第一种情况下,假设 Person 从一些实际处理数据库逻辑的基础对象继承 Load() 和 Save() ,如果我想改变持久性,它只涉及改变那个基础对象(或者甚至只是有一个 IPersistent 多个基类可以实现访问多个商店的接口(interface))。在后者中,如果持久层发生变化,我将需要更改 MyContext 的每个实例,而且零碎地进行会非常复杂。

我的印象是,执着-无知是件好事。我只是不明白为什么。似乎设置、使用、更改批发和零碎更改要复杂得多,这种复杂性没有任何优势。我只是遗漏了一些重要的东西,还是我对持久性感知/无知意味着有缺陷的全部理解?

最佳答案

持久性无知是关注点分离的一部分。你应该问问自己,为什么 Person 应该知道它应该如何加载或保存?人应该处理自己的小领域。

PI 意味着 Person 不关心它是来自内存、SQL、平面二进制还是任何其他持久性方式,并允许您稍后将持久层替换为其他东西。您最初开发应用程序时可能会使用带有基本序列化器的平面二进制文件来存储数据。稍后,出于性能原因,您可能会升级到 SQL——并且只有在其工作是处理持久性的一个位置(相关层/组件)才需要进行此更改。否则,您必须遍历整个代码库来更改处理持久性的小部分。

关于c# - 我不明白持久独立性的意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11084384/

相关文章:

c# - 如何在动态 CSharpCodeProvider 脚本中添加对 Outlook VSTO 的引用

c# - 如何在不进行轮询的情况下通知我的 C# Windows 应用程序网络状态更改?

c# - 如何以便携方式存储密码?

c# - 如何防止在 C# 中实例化对象

c# - 保护我的代码免受逆向工程

c# - 创建一个带标题的 .txt 文件

c# - 我应该如何处理用户浏览我站点中仅用于 AJAX 的页面?我应该使用 GET 吗?

c# - 以正确的顺序获取 chrome 标签

c# - 在 wpf 中制作 StackPanel 及其内容 "draggable"?

C# 无法解码 XML