求组一个模块结构的问题
一个SCA IDE的平台模块,需要将几类配置文件显示给用户并提供编辑修改的功能,其中用户添加某些信息项的时候需要结合其他信息做验证,现在想把界面和对xml文件的操作分层,目标是下层逻辑能完全复用,上网查了不少方法,写着写着就发现又不行了,主要就是数据验证的问题,比如下面这种情况:
<element1>
<element2>
<element2>
<element1>
用户可以对element2这一项信息进行修改,删除,添加,并且修改和添加都需要结合外部其他信息验证,验证的结果不但决定下层数据的变化,也决定了界面的一些行为,那这两层是怎么交互呢?还有比较郁闷的就是用户修改的信息可以全盘撤销,在实际底层xml数据和用户之间需要有一层临时数据。刚接触C#不久,很多架构方面的东西也不太懂。说的也有点乱,还请各位大大帮忙分析啊,模块都重构好几次了,还是很烂,郁闷啊
------解决方案--------------------
定义对象
[Serializable]
public class Device
{
[XmlElement]
public string Name { get; set; }
[XmlElement]
public string ID { get; set; }
}
序列化
Device device = new Device()
{
ID = "1",
Name = "MyDevice"
};
XmlSerializer serializer = new XmlSerializer(typeof(Device));
using (FileStream stream = new FileStream("c:/Device.xml", FileMode.Create))
{
using (StreamWriter writer = new StreamWriter(stream))
{
serializer.Serialize(writer, device);
}
}
序列化后得到的 Device.xml
<?xml version="1.0" encoding="utf-8"?>
<Device xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Name>MyDevice</Name>
<ID>1</ID>
</Device>
反序列化
using (FileStream stream = new FileStream("c:/Device.xml", FileMode.Open))
{
device = serializer.Deserialize(stream) as Device;
}
反序列化后就可以拿到Device对象了,之后绑定UI就方便了
------解决方案--------------------
既然是 XML,可以用 Path 来交互,比如要修改 element2 时就传递字符串 element1/element2 和改变后的值。验证如果是和 XML 中的数据比较就在下层中提供方法,如果是和其它数据比较就放上层。撤销的话下层模块读取 XML 后就是一个内存临时数据,修改方法里记录每一次修改,再提供方法返回撤销之后的数据,并提供保存方法将临时数据写入文件。