实例化对象 - 多态性

时间:2013-05-26 13:36:35

标签: domain-driven-design ddd-service domain-data-modelling

我有一个处理“债券”的金融应用程序。我需要

  1. 对应用程序进行建模以避免贫血模型(我理解这很糟糕)。
  2. 根据债券的类型实例化不同的实现。
  3. 系统从外部系统获取指令,并将指令应用于指定的绑定。因此我有一个指令实体

    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语句,但代码看起来不整洁。

    现在我的问题是,

    1. 这是建模的最佳方式吗?
    2. 对于计算,根据键类型计算的不同。所以我想实现多态。有人告诉我,我需要使用工厂来实例化正确的实现。这是最好的方法吗?
    3. 对于BondType 1,3,5我使用calculateA,对于bondType 2,7 ...我需要使用计算B.我如何实现不同的calc类型??? NB,我精通多态,但是,我无法找到如何实例化正确实现的可靠示例。 thnx阅读这个... ...

1 个答案:

答案 0 :(得分:2)

一些想法:

  • Instruction似乎用于命令DTO和用于存储审计跟踪的值对象。解耦这两个概念。

  • Bond实体(通常用于金融域)需要event sourcing。实际上,您已经存储了所有指令和解决方案。说清楚。如果您将绑定显式更改为域事件,则可能不需要存储所有指令。单个指令可能会导致多个事件。

  • 域服务的示例实际上是application service或命令处理程序。应用程序服务将存储库和委托协调到域对象。为了最好地实现应用程序服务,请将尽可能多的业务逻辑委托给域对象,在这种情况下为Bond。因此,让Bond实体确切地决定调用哪些子行为,以便应用程序服务仅在实体上调用单个方法。

  • 要提供多态性,请创建一个值对象以允许表示不同的键类型。让Bond实体委托给这个多态键类型值。您可能需要工厂最初实例化此债券类型VO,但一旦与债券实体关联,您不再需要致电工厂,债券只需参考债券类型VO。