【问题标题】:How to send commands using ServiceStack?如何使用 ServiceStack 发送命令?
【发布时间】:2012-04-09 22:45:20
【问题描述】:

我刚刚进入 REST 和 ServiceStack,现在我的 GET 正在返回可能是 XML 或 Json 的字符串。

我现在需要处理更改我的域模型的 PUT 或 POST 命令。

对于单个资源,我可以在我的域模型上使用许多命令(即对于客户资源,我可以更改名称、更改地址、更改帐单地址等)。对域模型的每次更改将仅包含这些更改中的一项(不是全部)。

我是否使用 ServiceStack 创建一个 DTO,其中包含一个标志/枚举来指示更改是什么?这意味着我有一个带有 case 语句的 REST 服务来指示我应该在域上做什么。这也意味着我有一个非常大的 DTO 对象,其中包含需要发布以更改我的域的数据(其中很多属性将为空)。

或者我是否创建了许多 DTO 和 REST 服务,每个服务都特定于我的模型上的更改?在这种情况下,我需要将 ?Command=changeAddress 添加到 URL 吗?不确定这是否正确。

【问题讨论】:

    标签: servicestack


    【解决方案1】:

    这也意味着我有一个非常大的 DTO 对象,其中包含数据 需要发布以更改我的域(其中很多 属性将为空)。

    具有空属性的非常大的 DTO 对象不是性能问题,因为 ServiceStack 的文本序列化程序(即 JSON/JSV)仅发出非空值的数据,并且不会花时间反序列化有效负载中没有的内容 - 所以从性能的角度来看,这不应该是一个问题。

    除了要求对每个 REST 服务动词使用相同的请求 DTO 之外,没有关于如何设计服务的“ServiceStack 方式”,并且 ServiceStack 不会强制采用设计风格。

    如果您想要更符合 REST 的设计,您可以将您的客户拆分为可单独修改的可管理实体,例如更改客户的帐单地址,我会这样做:

    PUT /customers/address/billing
    {
        "Line1": "123 Street",
        "City": "Brooklyn",
        "State": "NY"
    }
    

    并且有一个单独的 REST 服务来管理客户地址,例如:

    Register<CustomerAddress>("/customers/address/{AddressType}");
    

    【讨论】:

    • 在上面的例子中,如果我要更改收货地址而不是帐单地址,这不是同一个服务吗?换句话说,我如何区分账单和运输变化?或者我会有 Register("customer/address/shipping") 和 Register("customer/address/billing")?
    • 相同的 CustomerAddress 服务。 AddressType 属性将填充您可以用来区分它们的类型。
    • 谢谢。所以你是说在这种情况下,一个服务,但管理“帐单”和“送货”地址的两条路径?如果这是正确的,那么两种独立的服务是否有意义,一种用于计费,另一种用于运输?
    • 如果它是同一个实体,我将只有 1 个服务处理不同的地址。 AddressType 只是 CustomerAddress DTO 中的另一个属性。
    猜你喜欢
    • 2011-04-28
    • 2021-08-10
    • 1970-01-01
    • 2010-10-14
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多