不确定标题是否是最佳描述标题,但无论如何;
我正在与外部系统进行一些集成,该系统提供了一些总共超过300种方法的wcf服务。每个方法都使用api key参数和xml字符串参数。
我正在寻找一些关于如何处理xml字符串参数的干净设计。 一些方法具有可选的xml参数,嵌套参数和列表元素。
实施例: EntityManager.PerformCommand
<PARAMETERS>
<COMMANDID>Commands.ReadStatus</COMMANDID>
<ENTITYID>ID of the entity</ENTITY> (optional - for single entity)
<ENTITIES>
<ENTITY>
<ID>ID of entity #1</ID>
</ENTITY>
<ENTITY>
<ID>ID of entity #n</ID>
</ENTITY>
</ENTITIES> (optional - use for multiple entities)
<TIMEOUTDATETIME>2014-01-01 00:00:00.000</TIMEOUTDATETIME>
</PARAMETERS>
虽然不同的命令可以使用此服务的提供者记录的一些其他参数和语法。
那么对我的实际问题;什么是一个很好的设计呢?
我想在db和外部系统之间创建一个命令队列处理器和结果处理器,并在UI和数据库之间拥有自己的实现。 但是,在将XML发送到外部系统之前,我对如何从UI进行动态构建以及对XML进行一些验证没有任何好的想法。
至于现在,我在String.Format中输入了不同的XML参数到我传递参数的地方。我还测试了一个流畅的界面,我删除了无人居住的元素,但似乎有点乏味的方式来实现我想要的东西。
(请注意以下代码仅用于测试)
public class ParameterHelper
{
private StringBuilder parameters = new StringBuilder();
public ParameterHelper Initialize()
{
parameters.Clear();
parameters.Append("<PARAMETERS>");
return this;
}
public ParameterHelper NewLevel(string levelName)
{
parameters.AppendFormat("<{0}>", levelName.ToUpper());
return this;
}
public ParameterHelper CloseLevel(string levelName)
{
parameters.AppendFormat("</{0}>", levelName.ToUpper());
return this;
}
public ParameterHelper WithParameter(string parameterName, object parameterValue)
{
parameters.AppendFormat("<{0}>{1}</{0}>", parameterName.ToUpper(), parameterValue);
return this;
}
public ParameterHelper List(string parameterName, IEnumerable<string> parameterValues)
{
foreach (string parameterValue in parameterValues)
{
parameters.AppendFormat("<{0}>{1}</{0}>", parameterName.ToUpper(), parameterValue);
}
return this;
}
public ParameterHelper Object(string stringParameterFormat, params object[] args )
{
parameters.AppendFormat(stringParameterFormat.ToUpper(), args);
return this;
}
public ParameterHelper ObjectList(string outerParameterName, string innerParameterName, IEnumerable<string> parameterValues)
{
foreach (string parameterValue in parameterValues)
{
parameters.AppendFormat("<{0}><{1}>{2}</{1}></{0}>", outerParameterName.ToUpper(), innerParameterName.ToUpper(), parameterValue);
}
return this;
}
public ParameterHelper ParameterObject(List<ParameterObject> parameterObjects )
{
foreach (ParameterObject po in parameterObjects)
{
parameters.AppendFormat(po.ParameterStringFormat.ToUpper(), po.StringParameters.ToArray());
}
return this;
}
public string GetParameters()
{
parameters.Append("</PARAMETERS>");
var xDoc = XElement.Parse(parameters.ToString());
xDoc.Descendants().Where(x => string.IsNullOrEmpty(x.Value)).Remove();
return xDoc.ToString();
}
}
所以这就是我为那些比我更有经验的人伸出援助之手。
谢谢。