C# 我不知道';我不明白坚持和独立的意义

C# 我不知道';我不明白坚持和独立的意义,c#,C#,可能重复: 经过一段时间和一些问题,我试图找出实体框架,我得出结论,我只是不明白持久性无知对象的意义是什么 正如我所能说的,使用持久性感知对象和不使用持久性的对象之间的实际区别在于,人们会使用类似 Person p = Person.Load(id); p.Active = false; p.Save(); 另一种是按照 using (var context = new MyContext()) { Person p = context.Persons.Single(x => x

可能重复:

经过一段时间和一些问题,我试图找出实体框架,我得出结论,我只是不明白持久性无知对象的意义是什么

正如我所能说的,使用持久性感知对象和不使用持久性的对象之间的实际区别在于,人们会使用类似

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
接口,多个基类可以实现该接口来访问多个存储)。在后一种情况下,如果持久层发生了变化,我将需要更改
MyContext
的每个实例,而零碎地进行操作将非常复杂


我的印象是坚持无知是一件好事。我就是不明白为什么。设置、使用、批量更改和零碎更改似乎要复杂得多,但这对复杂的设置没有好处。我只是错过了一些重要的东西,还是我对“持续意识/无知”的理解有缺陷?

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


PI意味着这个人不在乎它是否来自内存、SQL、平面二进制或任何其他持久性方法,并允许您稍后将持久性层替换为其他内容。您最初可能会开发应用程序,使用带有基本序列化程序的平面二进制文件来存储数据。稍后,出于性能原因,您可能会升级到SQL,而此更改只需要在其-job-it用于处理持久性的一个位置,即关联的层/组件中进行。否则,您必须遍历整个代码库,在这里或那里更改处理持久性的小部分。

仅举您的示例,通过编写Person.Load(id)您所说的-通过查看其标识符加载此对象-您正在创建一个严格的工厂模式,这样您只能在知道对象id的情况下获取对象,稍后,您将发现需要根据某些搜索条件提取记录,并且您将添加更多工厂方法,而第二种解决方案已经为您提供了所需的所有自由度

第二种解决方案非常适合在运行时切换持久性逻辑,因为它与对象模型解耦,您可以从理论上决定在客户端代码中使用哪个持久性引擎,而无需硬编码和触摸OM,如果说您需要更改MyContext的每个实例,那就错了,您应该编写客户端代码,让它从某种工厂类或依赖项注入接收上下文

例如,您可以使用以下伪代码:

var person = onlineDbContext.Persons.Single(x=>x.Guid == myguid);

offlineDbContext.Persons.Add(person)
offlineDbContest.SaveOrUpdate();

除了持久性无关的实体之外,还应该抽象出ORM。一种常用的方法是“大卫哈尔,我不认为这是重复的”。至少,在阅读了关于另一个问题的答案后,我仍然不明白为什么一个正确抽象的持久性感知对象比一个不知道持久性的对象要好。看,我的经验正好相反。从知道持久性的基类型继承的Person对象,要更改为新的持久性层并不重要,但更改PI Person对象有点麻烦。如果每个对象都必须有自己关于如何访问其数据的独立知识,我当然不会说Aware对象更好,但只要你能将其抽象到一个地方,我就看不出PI有多好。伪代码是否必须在两个独立的
using()
语句中,每个上下文一个?还有,我怎么能有多个上下文支持同一个对象呢?我没有写using语句,因为这无关紧要,我甚至没有说一个特定的ORM,我只是告诉你,如果你通过处理数据的方式来分离数据,比如在邮递员的信中,你会得到更多的机会。如何创造一个不同的邮递员是另一个主题。这很公平。但是,我仍然不知道如何在不同的上下文中使用
person
。如果新来的邮递员在不同的路线上,而且从不来我家,那么换一个邮递员也没用。这个答案似乎正是我想要的,我只是想理解它。