所以主要是我在这里寻找最佳实践。我有一个系统,它基本上是一组规则,一些数据和一个管理器,以确保数据遵循规则。很简单。我试图找出处理保存和加载规则的最佳方法。对于第一次尝试,我有一个名为IRule的接口,所有规则都继承。
interface IRule
{
/* all rules inherit this */
string RuleName {get;}
}
interface IRuleTypeA : IRule
{
/* Type A Rules */
double[] Data;
}
interface IRuleTypeB : IRule
{
/* Type B Rules */
double[,] Data;
}
public static class IRuleExtensions
{
XElement AsXml(this IRuleTypeA ruleA)
{
//format my data my way and return an XElement representation
return new XElement(...);
}
XElement AsXml(this IRuleTypeB ruleB)
{
//format my different data in a different way and return an XElement
return new XElement(...);
}
XElement AsXml(this IRule rule)
{
object definition = null;
if(rule is IRuleTypeA)
definition = (rule as IRuleTypeA).AsXml();
else if(rule is IRuleTypeB)
definition = (rule as IRuleTypeB).AsXml();
return new XElement("RuleDefinition", new XAttribute("name", rule.RuleName),
definition);
}
}
所以在这里,我将保存功能放入正在保存的类中。我即将实现一个类似的加载机制,它将采用每个元素并构建规则。在我这样做之前,我想看看是否有关于此的最佳实践。我是否应该创建一个单独的系统来获取规则,查询它,然后将其保存到XML并使用工厂类型系统来使用Xml来构建对象?
interface RuleToXmlAdaptor
{
XElement AsXml(IRule rule);
IRule FromXml(XElement element);
}
class RuleAToXmlAdaptor : RuleToXmlAdaptor
{
XElement AsXml(IRule rule) { return AsXml(rule as IRuleTypeA); }
XElement AsXml(IRuleTypeA rule);
}
我在这些方法之间来回不确定何时使用其中一种方法,或者是否还有更好的解决方案。
我不想使用序列化,因为文件类型可能会不断变化,我可以通过这种方式简单地管理兼容性。
答案 0 :(得分:6)
我认为课程本身不应该知道它如何被序列化。这违反了单一责任原则。 SoupML说,想想明天会出现一种新的令人敬畏的序列化格式。如果你让对象之外的人负责序列化,那么使用SoupML让你的系统运行起来真的很容易,你甚至不需要改变现有的规则模型。
理想情况下,只有那些明确使用XML的单元应该知道XML,这样你的系统就可以用不关心格式而只关心接口的单元制作。稍后他们将被告知要使用哪个序列化器/解串器(控制反转)。这样做也支持开闭原则。你不必撬开任何东西进行修改,但是它会开放进行扩展。
答案 1 :(得分:0)
我认为您必须开始查看可在您的类和属性上使用的xml属性,这些属性可以让您轻松地将类对象序列化为xml文件,并在需要时再次反序列化。
答案 2 :(得分:0)
我不会这样做,因为它牵着你的手,虽然在短期内它可能更方便。而不是XElement
,为什么不让接口公开Dictionary<string,object>
。然后,您可以拥有键值对(使用众所周知的值类型,例如String
和Dictionary<string,object>
)。这样,单元测试将更容易,如果您愿意,可以使用更有效的格式。
interface RuleSerializer
{
Dictionary<string,object> AsDictionary(IRule rule);
IRule FromDictionary(Dictionary<string,object> data);
}