Domain driven design 实例化对象-多态性

Domain driven design 实例化对象-多态性,domain-driven-design,ddd-service,domain-data-modelling,Domain Driven Design,Ddd Service,Domain Data Modelling,我有一个处理“债券”的财务应用程序。我需要 为应用程序建模以避免贫血模型(我理解这是不好的) 根据债券的类型实例化不同的实现 系统从外部系统获取指令,并将指令应用于指定的绑定。因此我有一个指令实体 Instruction[Id,BondReference,Action,Value] e、 g.指示对通过的债券决议投票“是” 以及债券实体 Bond { Id: 1, Reference: Bond1 Resolutions: [

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

  • 为应用程序建模以避免贫血模型(我理解这是不好的)
  • 根据债券的类型实例化不同的实现
  • 系统从外部系统获取指令,并将指令应用于指定的绑定。因此我有一个指令实体

    Instruction[Id,BondReference,Action,Value]
    
    e、 g.指示对通过的债券决议投票“是”

    以及债券实体

    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,3,5,我使用计算A,对于键类型2,7。。。我需要使用计算B。如何实例化不同的计算类型???注意,我精通多态性,但是,我无法找到如何实例化正确实现的可靠示例。 感谢您阅读到目前为止……

    一些想法:

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

    • 债券
      实体是金融领域的典型实体,要求。实际上,通过存储所有指令和分辨率,您已经做到了。把它说清楚。如果您将对绑定的任何更改显式地作为域事件进行,则可能不需要存储所有指令。一条指令可能导致多个事件

    • 域服务的示例实际上是一个或一个命令处理程序。应用程序服务协调存储库和对域对象的委托。为了最好地实现应用程序服务,将尽可能多的业务逻辑委托给域对象,在本例中是一种
      Bond
      。因此,让
      Bond
      实体精确地决定要调用的子行为,以便应用程序服务只调用实体上的单个方法

    • 要提供多态性,请创建一个值对象以允许表示不同的键类型。将键实体委托给此多态键类型值。您可能需要一个工厂来初始化这个绑定类型VO,但是一旦它与绑定实体相关联,您就不再需要调用工厂,绑定只引用绑定类型VO


    thanx对于回复,我没有提到的一点是,这是一个棕地项目,我们正在慢慢地将其转换为一个新的应用程序,同时我们将使用现有的前端,因此我们无法更改数据库结构等。因此,我将牢记事件来源的建议(但很可能会(最有可能)现在不实现)因为我必须阅读相关主题等。我最喜欢的是1 instr=多个事件(我很可能从1条指令创建多个命令)。我将在实施您的建议后立即标记为答案我需要工厂的原因是因为大约3种键类型使用一种计算,而一种键类型使用另一种计算。因此,从长远来看,可以添加使用不同计算的bondType,因此1 bondType!=1计算。所以使用bondType进行计算意味着我在不同的地方重复计算。有道理吗?或者我可以进一步解释吗
    BondService
    {
        public void Apply(Instruction newInstruction)
        {
            var bond = _bondRepository.GetByReference(newInstruction);
            bond
                .RecalculateNominalValue(newInstruction)
                .CalculateInterest(newInstruction)
                .CancelInstruction(newInstruction)
                .Approve(newInstruction);
        }
    }