在我当前的项目中,我有很多对象需要持久化到XML并在运行时膨胀。我一直在通过.NET的DataContracts来管理它。我现在正在做的是创建一个单独的类,它代表我正在序列化的对象以及从盘中读取/写入这些对象,以避免在单个类中承担太多责任。这是一个例子:
public class Range
{
private float _min;
private float _max;
public float Min { get { return this._min; } }
public float Max { get { return this._max; } }
// Constructrs & Methods...
public SerializedRange GetAsSerializable();
}
Range
课程有免费课程:
[DataContract]
public class SerializedRange
{
[DataMember]
public float Min;
[DataMember]
public float Max;
// Constructor...
}
我的问题是,谁应该负责实际获取对象的序列化版本并将其膨胀为实际对象?我看到三个选项,但我不确定哪个(如果有的话)是最好的:
我意识到在某些情况下你必须以某种方式做到这一点,因为除了这个有点人为的例子之外的限制。因为有更多的方法可以做到这一点,我真正想要的是一个通用的经验法则,产生整洁,可读和可扩展的代码。
答案 0 :(得分:2)
如果你“打破”你应用到组成部分你会得到什么逻辑组件?根据我的理解,这里有一些:
和其他许多人(但根据你的描述只采取了一个子集)
现在,数据层的工作是将内容写入某些存储 - 在您的情况下将XML文件写入磁盘。
现在,当您'查询'提取它的文件?数据层。谁应该填充相应的域对象?那么数据层本身。
数据层是否应该将人口责任委托给单独的班级/工厂?这取决于它是否会被其他人重复使用。如果没有,像内部类这样的概念可以提供很好的帮助(它们存在于java世界中,不确定它在C#.NET中是否相同)。这样你就可以将它模块化到一个特定的类中,除非你想要那样,否则它不会被其他类公开显示。
你应该去工厂吗?是的你可以。但要确保这样做在逻辑上是正确的。您可以使用许多对象填充器 - 这可以将通胀功能隔离到一个类,工厂本身可以成为数据层的一部分(如果您希望这样)。
一旦你描述了这些问题,你就可以更好地决定把这段代码放在哪里。我已经提供了一些可以派上用场的指示。
希望它有所帮助...