SOA中的CRUD操作

时间:2015-02-19 23:56:52

标签: soa crud

SOA中的CRUD操作:

可以在此处找到此问题的上下文:Why are CRUD operations so bad in a SOA design?

我正在开发一个接口 - Ex:Order,其中我有CreateOrder,UpdateOrder和GetOrder方法。该订单还有OrderLines。由于我不想将CreateOrderLine,GetOrderLine作为单独的方法,我通过CreateOrder和GetOrder方法执行这些任务。对于删除和更新,应调用Update方法。但我正试图找出一种删除特定OrderLine的模式。如何计算更新和删除之间的区别?关于如何实现DeleteOrderLine,我有以下想法:

方法1:

1a:如果您想删除一个订单行: - 填充请求中的所有OrderLines,除了要删除的OrderLines。

1b:如果您想要更新一个订单行: - 使用要更新的值的新值填充请求中的所有OrderLines。

2调用UpdateOrder 3实现在开始任何处理之前删除所有OrderLineItem,并始终将Lines添加为新的。

方法2: - 添加某种“命令”'到每个订单行('添加''删除'更新'),实施可用于执行适当的操作。 - 要进行更新,请使用“更新”标记需要更新的行。命令。只有这些更新。 - 对于删除,请使用'删除'标记需要删除的行。命令。只有这些被删除。

是否有任何其他想法或机制可以使其发挥作用?

感谢。

2 个答案:

答案 0 :(得分:1)

显然,"简单的CRUD"尖叫为REST实现。 (没有预定的拖钓或火焰戏弄,我自己就是一个SOAP实施者)

但假设您仍然瞄准SOAP实现(因为您需要XML模式验证,或者您的团队已经习惯了该技术等),那么我会推动严格遵循Canonical Schema Pattern (Erl)我会使用你的"方法1"。

以下是&原因如下:

如何:

通过这种方式,我不想创建一个新的Data Architect Babel塔,并找出" Order Canonical ™""""通过10周的过程(经常使用的方法)。我希望快速查看用于 GetOrder响应的当前架构,并使用THAT" object"在所有操作中,按原样。

ie:您在响应中使用的架构" get"与创建更新操作的请求中的操作相同。 实际上,通常可以合并创建更新以创建 Upsert (在SOA操作中通常称为保存)。使用此方法唯一的区别通常是创建时缺少主键。

这种模式强迫"方法1',这是一件好事。

<强>为什么:

恕我直言,方法2很少比方法1快,即使它更多&#34;优化&#34; (我们只触及需要编辑的OrderLines,而不是其他)。 例证:要使用方法2删除/更新少量行,您有两个选择:执行大量单独删除,或使用许多精确的WHERE子句COMPOSE单个删除。 使用方法1(和规范模式模式),您可以一直删除订单的所有OrderLines,然后重新插入它们。该算法很简单,而且非常易于维护。

如果您尊重此模式并使用数据库事务,则数据库损坏不是您的&#34;方法1&#34;的问题。生成的客户端更简单(它们有很多相同的对象被重用),并且最终组合服务的操作中介变得非常简单。

<强>声明:

如果你有大量的OrderLine删除和更新确实执行我的逻辑并不是完全合理的(我假设你不是,这些通常是手动的,很少调整)。如果你有那么多,那么我会考虑仍然使用上述相同的操作并添加一个专门的SaveOrderLine操作(但不是GetOrderLine或CreateOrderLine)。

答案 1 :(得分:0)

  

方法2: - 为每个订单行添加某种“命令”(“添加”,“删除”,“更新”),实施可以使用该命令执行适当的操作

方法2需要创建一些以对象形式陈述的复杂更新操作图:

var OrderUpdateDTO = new OrderUpdateDTO(
    OrderID = 23,
    CommentChange = "An example of Order property change",
    OrderLineUpdates = [
        new OrderLineCreateDTO(
            ProductID = 1025,
            Quantity = 3
        ),
        new OrderLineUpdateDTO(
            OrderLineID = 94,
            QuantityChange = 2
        ),
        new OrderLineDeleteDTO(
            OrderLineID = 95
        ),
        new OrderLineDeleteDTO(
            OrderLineID = 96
        )
    ]
)

这种复杂图形的原因是SOA不支持方法组合(see here)和性能考虑(你不能一个接一个地使用很多小型CRUD服务方法,你必须进行一次调用)。 / p>

创建更新图后,将调用服务更新方法:

Service.Update(OrderUpdateDTO)

服务解析此更新图并调用业务逻辑层方法来应用这些更改。

  

是否有任何其他想法或机制可以使其发挥作用?

方法2比方法1复杂得多,因为它需要:

  1. 为服务开发人员设计更新图表并实现解析更新图表的逻辑
  2. 为服务客户端工作,以便在每次更改内容时构建更新图表