我有一个处理“债券”的金融应用程序。我需要
系统从外部系统获取指令,并将指令应用于指定的绑定。因此我有一个指令实体
Instruction[Id,BondReference,Action,Value]
e.g。在债券上传递解决方案 投票'是'的指示
Instruction
{
BondReference: Bond1,
Action: Vote
Value: VoteYes
ResolutionReference: Resolution1
}
和债券实体
Bond
{
Id: 1,
Reference: Bond1
Resolutions: [
{Resolution1: We have resolved to increase our stake in Google},
{Resolution2: We have resolved to fire the CEO}
...
]
Instructions: [Inst1,Inst2,Inst3...]
}
然而,一条指令通常不只是一件事(它实际上是一个中的许多指令),例如取消先前指令的指令,这意味着,首先,它取消先前的交易,然后需要重新计算某些值。此外,单个指令可能会过载,可能是取消先前的指令以及投票决定。
我被建议使用域服务来处理新指令。
BondService
{
public void Apply(Instruction newInstruction)
{
var bond = _bondRepository.GetByReference(newInstruction);
bond
.RecalculateNominalValue(newInstruction)
.CalculateInterest(newInstruction)
.CancelInstruction(newInstruction)
.Approve(newInstruction);
}
}
我在这个结构中看到的问题是,对于每个指令,即使方法不相关,也会调用所有方法。我可以使用一些if语句,但代码看起来不整洁。
现在我的问题是,
对于BondType 1,3,5我使用calculateA,对于bondType 2,7 ...我需要使用计算B.我如何实现不同的calc类型??? NB,我精通多态,但是,我无法找到如何实例化正确实现的可靠示例。 thnx阅读这个... ...
答案 0 :(得分:2)
一些想法:
Instruction
似乎用于命令DTO和用于存储审计跟踪的值对象。解耦这两个概念。
Bond
实体(通常用于金融域)需要event sourcing。实际上,您已经存储了所有指令和解决方案。说清楚。如果您将绑定显式更改为域事件,则可能不需要存储所有指令。单个指令可能会导致多个事件。
域服务的示例实际上是application service或命令处理程序。应用程序服务将存储库和委托协调到域对象。为了最好地实现应用程序服务,请将尽可能多的业务逻辑委托给域对象,在这种情况下为Bond
。因此,让Bond
实体确切地决定调用哪些子行为,以便应用程序服务仅在实体上调用单个方法。
要提供多态性,请创建一个值对象以允许表示不同的键类型。让Bond实体委托给这个多态键类型值。您可能需要工厂最初实例化此债券类型VO,但一旦与债券实体关联,您不再需要致电工厂,债券只需参考债券类型VO。