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: - 添加某种“命令”'到每个订单行('添加''删除'更新'),实施可用于执行适当的操作。 - 要进行更新,请使用“更新”标记需要更新的行。命令。只有这些更新。 - 对于删除,请使用'删除'标记需要删除的行。命令。只有这些被删除。
是否有任何其他想法或机制可以使其发挥作用?
感谢。
答案 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复杂得多,因为它需要: