Typescript 域实体在干净体系结构中如何相互引用

Typescript 域实体在干净体系结构中如何相互引用,typescript,architecture,clean-architecture,Typescript,Architecture,Clean Architecture,根据Bob叔叔的实体定义: “该实体是纯粹的商业实体,而不是其他实体。” 我想澄清一下实体之间的业务逻辑关系。 假设我们有两个类,我们需要实现它们之间的关系。我看到3种选择: 有一个客户端和宠物类(客户端一对多动物)。Animal类具有客户端ID class Client { private _clientID: ClientID; public getID(): ClientID { return this._clientID; } } class Animal {

根据Bob叔叔的实体定义:

“该实体是纯粹的商业实体,而不是其他实体。”

我想澄清一下实体之间的业务逻辑关系。 假设我们有两个类,我们需要实现它们之间的关系。我看到3种选择:

  • 有一个客户端和宠物类(客户端一对多动物)。Animal类具有客户端ID

    class Client {
      private _clientID: ClientID;
    
      public getID(): ClientID {
        return this._clientID;
      }
    }
    
    
    class Animal {
      private _animalID: AnimalID;
      private _ownerID: ClientID;
    
      public getID(): AnimalID {
        return this._animalID;
      }
    
      public getOwnerID(): ClientID {
        return this._ownerID;
      }
    }
    
  • 在这种情况下,我们通过宠物的ID知道谁是宠物的主人。我们可以根据主人ID的存在做出一些决定

    关注点#1。如果我们需要根据相关实体领域做出一些关键的业务决策,我们应该怎么做

  • 相同的类,但Animal类具有客户端依赖关系

    class Client {
      private _clientID: ClientID;
    
      public getID(): ClientID {
        return this._clientID;
      }
    }
    
    
    class Animal {
      private _animalID: AnimalID;
      private _owner: Client;
    
      public getID(): AnimalID {
        return this._animalID;
      }
    
      public getOwner(): Client {
        return this._owner;
      }
    }
    
  • 在这种情况下,我们了解所有者的一切

    关注点#2。在这种方法中,可能会出现这样一种情况,即我们会得到一个深度的实体依赖关系:

    A {
       B {
           C {
              ... and so on ...
           }
       }
    }
    
    事实上,我们必须初始化数据库中的每个实体,并将它们的实例注入到其他实体中

  • 我们没有任何关系ID。我们在存储库中创建“getPetsByClientId”之类的方法(反之亦然),并协调用例中的所有内容

    class Client {
      private _clientID: ClientID;
    
      public getID(): ClientID {
        return this._clientID;
      }
    }
    
    
    class Animal {
      private _animalID: AnimalID;
    
      public getID(): AnimalID {
        return this._animalID;
      }
    }
    
  • 担忧2:我觉得我们正在失去业务逻辑的一大部分。例如,我们需要根据“这只宠物有主人吗?”(是的,新的条件-现在我们可以在没有实际主人的情况下创建宠物)做出一些决定,这个决定是一个高级策略,一个纯粹的业务逻辑(同样,是虚构的)。所以它的位置是在一个实体中


    4(额外)。没有灵丹妙药。每种情况都需要单独实施。(实体应该包含并建模最重要的业务规则。如果两个域对象之间的双向依赖关系是如此重要的业务规则,那么它应该反映在实体中


    这可以通过使用ID链接实体或直接对象引用来实现。稍后,您可能会根据编程语言的支持为实体实现自定义相等和比较操作。

    我不太熟悉Clean体系结构。您是指?我想这会有所帮助我想知道这些实体是否对应于数据库记录,如果是,您将使用哪种类型的数据库?对于关系数据库,我更喜欢在Animal中存储客户端ID,以匹配多对一关系的SQL最佳实践。对于存储类引用的文档数据库,可能更有意义。@JesseHallette Bob说:“数据库可以用Oracle、MySQL、Coach、Datomic甚至是平面文件来实现。业务规则一点都不重要。这意味着数据库决策可以推迟,你可以在做出数据库决策之前集中精力编写和测试业务规则。”我们可以在自己实现域后决定要将哪种DB集成到业务逻辑中我刚刚发现了聚合根和域事件之类的东西,但不管怎样,你的回答描述了一个主要思想-一切都取决于业务规则。我过去常在RDB的上下文中思考,这就是我的问题。谢谢!