如何将持久内容传达给处理消费类的开发人员

本文关键字:消费类 处理 开发 | 更新日期: 2023-09-27 17:54:23

假设我们有一个业务对象,我们称它为Foo,它包含Bar s的有序列表。我们将这个Foo作为XML传递。

我们有一个反序列化Foo XML节点(FooXMLDeserializer)的类,它本身使用反序列化子Bar XML节点(BarXMLDeserializer)的类。

现在,我正在向BarXMLDeserializer添加一些功能,以维护某些状态,这样,如果在两个单独的Foo节点上调用FooXMLDeserializer而不重置BarXMLDeserializer的状态,则结果可能无效。BarXMLDeserializer不知道它何时处理了Foo中的最终Bar

是否有一些方法,我可以设计BarXMLDeserializer类与开发人员在消费类的工作,它有状态,必须为每个Foo重置?

进一步信息:

  • 我的改变解决了我们代码中的一个小问题,我无法说服我的经理让我花X天时间重新设计整个系统来很好地处理这种情况。
  • 如果它重要,BarXMLDeserializer将其状态保存在BarStateTracker类中,这是它的内部。
  • c#编程,但正在寻找更通用的解决方案。

谢谢。

如何将持久内容传达给处理消费类的开发人员

将序列化器仅作为静态方法公开:

// no public constructor, etc
var deserializer = BarXMLDeserializer.CreateNew();

然后,当您完成数据反序列化后,在对象中标记一个字段。如果设置了该字段,则在调用反序列化方法时,如果使用同一实例反序列化更多数据,则抛出异常。

if(IsInstanceExhausted)
   throw new InvalidOperationException("You must use a fresh instance.");

他们会在第一个异常之后发现它。此外,将类标记为IDisposable,以便代码自然地使用using语句:

using(var deserializer = BarXMLDeserializer.CreateNew())
{
}

还有很多其他的方法。或者,您可以简单地将您的反序列化器设计为在反序列化尝试后清除其状态或重置,或者在反序列化尝试开始时清除状态。