gpt4 book ai didi

c# - 在 C# 中实现 DSL 以生成特定于域的 XML

转载 作者:数据小太阳 更新时间:2023-10-29 01:51:39 24 4
gpt4 key购买 nike

我有一个遗留的 HTTP/XML 服务,我需要与它交互以实现我的应用程序中的各种功能。

我必须为服务创建范围广泛的请求消息,因此为了避免在代码周围散布大量魔法字符串,我决定创建 xml XElement 片段来创建一个基本的数字用户线。

例如。

而不是...

new XElement("root", 
new XElement("request",
new XElement("messageData", ...)));

我打算使用:

Root( Request( MessageData(...) ) );

将 Root、Request 和 MessageData(当然,这些仅用于说明目的)定义为静态方法,它们都执行类似于以下操作的操作:

private static XElement Root(params object[] content) 
{
return new XElement("root", content);
}

这给了我一种伪功能组合风格,我喜欢这种风格。

我的最终问题实际上是理智/最佳实践之一,因此它可能过于主观,但我很高兴有机会获得一些反馈。

  1. 我打算将这些私有(private)方法移至公共(public)静态类,以便任何想要为服务编写消息的类都可以轻松访问它们。

  2. 我还打算让服务的不同功能由特定的消息构建类创建消息,以提高可维护性。

这是实现这个简单 DSL 的好方法,还是我错过了一些能让我做得更好的特殊调味料?

让我怀疑的是,一旦我将这些方法移动到另一个类,我就会增加这些方法调用的长度(当然我仍然保留删除大量魔术字符串的最初目标.) 我是否应该更关心 DSL 语言类的大小 (loc),而不是语法简洁性?

注意事项

请注意,在这种情况下,远程服务实现不佳,并且不符合任何通用消息传递标准,例如WSDL、SOAP、XML/RPC、WCF等

在那些情况下,创建手工构建的消息显然是不明智的。

在极少数情况下,您确实必须处理与此处讨论的服务类似的服务,并且无论出于何种原因都无法对其进行重新设计,下面的答案提供了一些处理这种情况的可能方法。

最佳答案

您是否注意到所有 System.Linq.Xml 类都密封?

public class Root : XElement
{
public Request Request { get { return this.Element("Request") as Request; } }

public Response Response { get { return this.Element("Response") as Response; } }

public bool IsRequest { get { return Request != null; } }

/// <summary>
/// Initializes a new instance of the <see cref="Root"/> class.
/// </summary>
public Root(RootChild child) : base("Root", child) { }
}

public abstract class RootChild : XElement { }
public class Request : RootChild { }
public class Response : RootChild { }

var doc = new Root(new Request());

请记住,这不适用于“阅读”场景,您将只能拥有来自您的应用程序通过代码创建的 XML 的强类型图。

关于c# - 在 C# 中实现 DSL 以生成特定于域的 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7304162/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com