Так что, в основном, я ищу ответ на этот вопрос передового опыта. У меня есть система, которая в основном представляет собой набор правил, некоторые данные и менеджер, чтобы убедиться, что данные соответствуют правилам. Довольно просто Я пытаюсь выяснить лучший способ обработки сохранения и загрузки правил. Для первой попытки у меня есть интерфейс 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);
}
Я перебираю эти методы, не зная, когда использовать тот или иной метод, или если есть еще лучшее решение.
Я не хочу использовать сериализацию, потому что тип файла может постоянно меняться, и я могу довольно просто управлять совместимостью таким образом.