将参数作为Xml传递给存储过程

Rob*_*ett 6 c# xml t-sql soa

我有一个要求将参数作为Xml传递给我的存储过程.

我在中间层有一个WCF服务,它调用我的数据层,然后将请求转发到适当的存储过程.

设计是WCF服务负责构建Xml以传递到存储库.

我只是想知道是否要控制中间层中Xml中包含的参数,还是使用客户端构建的字典,然后将其转换为中间层的Xml?

目前我已经选择了后者 - 例如:

 public TestQueryResponseMessage TestQuery(TestQueryRequestMessage message)
 {
        var result = Repository.ExecuteQuery("TestQuery", ParamsToXml(message.Body.Params));

        return new TestQueryResponseMessage
        {
            Body = new TestQueryResponse
            {
                TopicItems = result;
            }
        }
    }


private string ParamsToXml(Dictionary<string, string> nvc)
{
        //TODO: Refactor
        StringBuilder sb = new StringBuilder();

        sb.Append("<params>");
        foreach (KeyValuePair<string, string> param in nvc)
        {
            sb.Append("<param>");
            sb.Append("<" + param.Key + ">");
            sb.Append(param.Value);
            sb.Append("</" + param.Key + ">");
            sb.Append("</param>");
        }
        sb.Append("</params>");

        return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)

但是我可能需要第一种方式.例如

public TestQueryResponseMessage TestQuery(TestQueryRequestMessage message)
{
       string xml = string.Format("<params><TestParameter>{0}</TestParameter></params>",message.Body.TestParameter)

       var result = Repository.ExecuteQuery("TestQuery", xml);

      return new TestQueryResponseMessage
      {
          Body = new TestQueryResponse
          {
                    TopicItems = result;
          }
      }
}
Run Code Online (Sandbox Code Playgroud)

这个hivemind推荐什么?

Mar*_*ell 6

如果你必须使用xml; 然后我会使用一个代表该数据的类,而不是传递一个字典,而是用XmlSerializer它来获取它作为xml:

[Serializable, XmlRoot("args")]
public class SomeArgs {
    [XmlElement("foo")] public string Foo { get; set; } 
    [XmlAttribute("bar")] public int Bar { get; set; }
}
...
SomeArgs args = new SomeArgs { Foo = "abc", Bar = 123 };
XmlSerializer ser = new XmlSerializer(typeof(SomeArgs));
StringWriter sw = new StringWriter();
ser.Serialize(sw, args);
string xml = sw.ToString();
Run Code Online (Sandbox Code Playgroud)

这使得以面向对象的方式管理哪些参数适用于哪些查询变得更加容易.这也意味着你不必自己做xml转义......