【问题标题】:TS, DDD: Value Object and factoryTS、DDD:值对象和工厂
【发布时间】:2021-04-18 05:13:25
【问题描述】:

我创建了这个聚合和这个值对象只是为了说明疑问,我的值对象还没有验证

聚合:

export class Person extends Entity<{name: PersonName}> {
  private constructor(name: PersonName, id?: string) {
    super({name}, id)
  }
  public static build(
    name: PersonName, id: string
  ): Either<IErrorModel[], Person> {
    const person = new Person(name, id)
    return right(person)
  }
}

值对象:

export class PersonName extends ValueObject<IName> {

  public static maxLength: number = 30;
  public static minLength: number = 4;

  private constructor(props: IName) {
    super(props)
  }

  public get fullName(): string {
    return `${this.props.firstName} ${this.props.lastName}`
  }
    public get firstName(): string {
        return this.props.firstName
    }
    public get lastName(): string{
        return this.props.lastName
    }

    public static build(props: IName): Either<IErrorModel[], PersonName> {
        const name = new PersonName(props)
        return right(name)
    }

}

我有一个问题,我应该如何在我的聚合中创建我的工厂 一个例子我有我的价值对象:名称,我必须在我的聚合工厂中创建并验证这个价值对象,或者我必须在服务中创建例如

在我的聚合工厂:

export class Person extends Entity<{ name: PersonName }> {
  private constructor(name: PersonName, id?: string) {
    super({ name }, id)
  }
  public static build(
    { lastName, firstName }: { firstName: string; lastName: string },
    id: string,
  ): Either<IErrorModel[], Person> {
    let errors = [] as IErrorModel[]
    // others validations
    const name = PersonName.build({lastName,firstName})
    if(name.isLeft()) errors.push(...name.value)
    const person = new Person(name.value as PersonName, id)
    return right(person)
  }
}

或者例如在我的个人服务中:

聚合工厂:

  public static build(
    name: PersonName, id: string
  ): Either<IErrorModel[], Person> {
    const person = new Person(name, id)
    return right(person)
  }

服务:

export class PersonService{
  execute(req: any) {
    let errors = [] as IErrorModel[]
    const {lastName, firstName} = req
    const name = PersonName.build({lastName,firstName})
    if(name.isLeft()) errors.push(...name.value)
    const person = Person.build(name.value as PersonName, v4())
  }
}

我的疑问是: 我应该在烧结厂还是其他地方制作我的贵重物品?

【问题讨论】:

    标签: typescript domain-driven-design


    【解决方案1】:
      public static foo( ... ): Either<IErrorModel[], Thing>
    

    我将为此模式使用的名称是 Parser(参见 Parse, Don't Validate,作者 Alexis King)。

    解析器通常会依赖于域模型,但通常不会属于域模型;它的形式和功能类似于 REPOSITORY。

    特别是,我们试图尽可能避免不属于领域的关注点污染我们的领域模型。

    一个可以明确区分的思想实验——假设我们有一千个不同的输入消息需要解析成一个人。我们不希望在我们的域模型中有一千个不同的解析器:解析代码会压倒一切。相反,我们希望对一千条输入消息中的每一条都有一个专门的解析器。如果我们将解析器的实现保持在输入消息附近而不是域附近,那么(a)我们将解析代码保持在域之外,并且(b)更容易弄清楚每个解析器是如何被使用的,并且完全关闭解析器需要什么条件。

    【讨论】:

    • 你好,非常感谢,我有点怀疑,但我想你明白了,将我的值对象的创建与我的聚合之外的解析模式分开会更好吗?这个会比较好吗?据我了解,这种模式取代了验证?
    • 啊,如果你能帮助我,在我的聚合中使用compisition验证会“丑陋”吗?通过我的聚合工厂的参数传递它?
    • 我会将完全解析的值传递给您的聚合
    • 谢谢,所以我必须在我的服务上创建它们并将它们完全解析后发送到我的域,非常感谢。
    猜你喜欢
    • 2012-07-08
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多