WCF – 设计参数决策

我正在为FundManagement设计服务。 FundManagement Service有一个名为“UpdateFundApprovalDate(FundDTO fund)”的操作。 此操作将使用fundingID的批准日期更新资金表记录。 该服务将由“FundManagementUI”客户端使用。

如果合同续订正在进行,则有一项业务规则,即不应更新批准日期。

有一个单独的续订服务。 续订服务使用续订表中的数据(其中包含资金ID)。 更新表的结构是(RenewalID,FundingID,RenewalStartDate,Renewal CompletionDate,RenewalStatus)。 有一个名为“public List GetInProgressRenewal(FundDTO fund)”的服务操作。

一点很重要。 虽然两个服务都使用相同的数据库,但“续进”续订应由续订服务决定。 它可以基于续订记录的状态或完成日期。 续订服务决定“进行中”续订的业务逻辑。 FundManagement Service声称没有对该逻辑的所有权。

  1. 什么是解释上述行为的SOA原则/模式? (使用续订服务确定“进行中”续订,但续订服务可能会根据自身利益更改逻辑。)。 有关此类情景的指导原则是什么?

  2. 对于任何涉及此类设计决定的文章,您有什么建议吗?

  3. 在FundManagement Service内部,谁应该负责validation返回的续订列表是否为NULL? 这种validation应该在服务操作方法代码内部还是在FundBusinessLayer内部(服务人员调用)中进行?

注意:这里的SOA将使用WCF实现,业务classess将是使用C#开发的dll。

读:

  1. SOA / WCF剖析系统和服务边界

在这种情况下,我不会使用续订服务中的现有服务,就像您说他们可以更改一样。

我遵循的原则是SOA服务应该具有商业意义。

因此我会创建一个新操作: IsContractRenewalInProgress 。 这样就无需考虑谁应该负责validation返回的续订列表是否为NULL。 更重要的是,列表为NULL意味着没有合同续订正在进行中。

然后,在进行任何更改之前, UpdateFundApprovalDate将调用并检查IsContractRenewalInProgress的结果。

IsContractRenewalInProgress应该在续订服务中,因为它是拥有数据和业务逻辑的续订服务,以了解合同续订的进行时间。

任何财务信息处理都围绕着一个关键方面 – 精心管理地位。

尝试为合同系统创建状态模型,并仔细记录从给定状态可以到达的状态,以及为了从一个有效状态移动到另一个有效状态必须进行的处理。 然后,确保在事务中发生从一个状态到另一个状态的任何移动,使得未能实现下一状态将合同返回到其先前状态。

您可能会发现,如果您对状态进行粒化以反映当前的处理 – 而不是审查,更新,批准,拒绝,资助,也会使状态设置为表明合同处于不稳定状态,这将使您更容易 – 即它正在进行审查,现在正在获得资金支持等。通过这种方式,系统可以识别目前正在积极处理的合同。 如果环境在没有成功回滚的情况下突然崩溃,它还可以轻松识别发生了什么。

确保您只有一个服务可以更新合同的状态,并且此服务会在更新期间锁定合同。 所有其他进程将使用此服务来执行所需的状态更改。

因此,在您的特定情况下,UpdateFundApprovalDate(FundDTO基金)只会在状态为PENDING_FUNDING的合约上运行,并且可能只是整个处理的一部分 – 无论如何,当运行您的updateFundApprovalDate(FundDTO基金)的流程时)如果成功,合同状态将为FUNDED – 或者如果资金尝试失败,则所有更改都将被回滚,从而导致PENDING_FUNDING的原始合同状态。 如果系统崩溃,合同状态可能会保留在当前处理状态,状态类似于资金。 资金本身在你的州模式中不是一个有效的状态 – 它是一个临时状态。 所有流程只会开始处理有效状态的合同,而不是临时状态。

对于可以在这种情况下使用的模式,请查看State Machine模式。