0

我在 C# 中有一个类层次结构,描述了一些数据结构。有一些基类,它们自动执行一些一般任务,在它们之上还有专门的类,它们反映了实际的结构。

我希望该结构只能加载一次。如果您加载它 - 或修改它的任何字段 - 加载应该不再可用。

我想出了三个解决方案:

  1. 创建一个标志bool loaded字段并在加载(或更改)类时设置它。

    优点:不需要改变结构,直接使用(new+ .Load()

    缺点:我必须努力在整个结构中传播这个标志,并且通常会照顾它,以便在每一种可能的情况下都会更新它。此外,这是运行时解决方案(第二次加载 = 异常),而我总是更喜欢编译时解决方案。

  2. 将加载移动到类的构造函数,这样可以创建一个空结构或创建它并在之后立即加载。

    优点:编译时解决方案:任何时候都无法简单地加载结构。

    缺点:加载依赖于派生类,无法在构造函数中调用虚方法,这使事情变得复杂。这可以被克服,但代价是界面的简单性。也发生了,在加载时,我必须返回一个对象,这需要 ctor 有一个out参数(无论如何这似乎是必要的)。

  3. 创建类工厂,隐藏 ctor 并提供工厂方法来创建空的和预加载的结构。

    优点:编译时解决方案。工厂可以通用以涵盖所有派生类

    缺点:复杂的代码和不直观的界面(工厂创建事物的方式比操作员不太明显new)。此外,此解决方案依赖于internal修饰符来使结构和工厂成为朋友。

我的问题是:

  • 有没有更好的方法来防止多次加载结构?
  • 或者:有没有办法克服提议的解决方案的缺点?

编辑:回应答案

将我的结构想象为 Word 文档或 Excel 表。Word 文档只能加载一次,您不能在已加载的文档上“调用加载”。这是我想要的一种安全措施。换句话说,我想阻止某人打电话:

MyStructure s = new MyStructure();
s.Load("file1.str");
s.Load("file2.str"); // Doesn't make sense

并且:

MyStructure s = new MyStructure();
s.SomeProperty = 15;
s.Load("file1.str"); // Doesn't make sense
4

3 回答 3

0

您应该为此使用身份映射。它跟踪已经加载了哪些实体。

于 2013-11-12T11:25:59.463 回答
0

额外的缺点:

1 - 您的数据对象不再只保存业务数据 - 它还保存加载状态 - 这违反了SRP

3 - 当创建更多类型时,工厂可能不得不改变 - 这将意味着更多的维护

看起来您正在使用活动记录模式。我不会使用活动记录模式,因为它结合了业务数据和数据加载——这违反了SRP

相反,使用带有POCO的存储库模式来创建您的对象。

但是,如果您保留当前代码,则可以在Load方法中添加检查 - 如果文件名与当前文件名不同(肯定是属性),则会阻止加载,因为它在这种情况下没有意义。

于 2013-11-12T11:46:51.433 回答
-2

我希望该结构只能加载一次。

你看过单例模式吗?

单例模式将类的实例化限制为一个对象。使用该模式将确保您不会重新发明轮子。

但是,我不确定您是否真的只想要应用程序中的一个对象,或者您想确保您的代码出于性能原因不会多次检索数据 - 因此有两个答案。

于 2013-11-12T11:24:35.683 回答