Tengo un requisito para pasar los parámetros como Xml a mis procedimientos almacenados.Pasar parámetros como Xml a un procedimiento almacenado
Tengo un servicio WCF en el nivel medio que realiza llamadas a mi capa de datos, que a su vez reenvía la solicitud al procedimiento almacenado apropiado.
El diseño es que el servicio WCF es responsable de construir el Xml para pasarlo al Repositorio.
Me pregunto si debo mantener el control de los parámetros contenidos en el Xml en el nivel intermedio o usar un diccionario creado por el cliente que luego convierto a Xml en el nivel intermedio.
En el momento que he pasado por esta última - por ejemplo:
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();
}
Sin embargo puede ser que necesite hacerlo de la primera forma. P.ej.
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;
}
}
}
¿Qué recomienda hivemind?
Cosas como string.Format no son adecuadas para crear xml, ya que existen reglas de escape complejas que deben seguirse. XmlWriter sería una alternativa razonable para el caso del diccionario, pero considere el objeto orientado abordado a continuación. –