【问题标题】:CQRS: Queries and business rulesCQRS:查询和业务规则
【发布时间】:2020-05-16 13:31:08
【问题描述】:

我在 NodeJs 中使用 CQRS、DDD 和 Clean 架构,在我的查询方面,我需要使用一些业务规则(计算,这里是 getNetRealEstateAssets())从我的 API 返回一些信息。

我有一个 GetTenantsQuery 和一个 GetTenantsHandler 类:

export default class GetPerformancesHandler {
   async execute(query) {
     const tenants = tenantRepository.find();

     return tenants; // array of TenantQueryModel
   }   
}

class TenantQueryModel {

  constructor(){
    this.rents = [];
    this.grossAssets = xxx;
    this.liabilities = xxx;
  }

  getNetRealEstateAssets = () => {
    if (!this.grossAssets || !this.liabilities) return null;

    const round = (amount, roundLevel) => (amount / roundLevel).toFixed() * roundLevel;
    let netRealEstateAssets = this.grossAssets - this.liabilities;
    netRealEstateAssets =
      netRealEstateAssets > 10000 ? round(netRealEstateAssets, 1000) : round(netRealEstateAssets, 100);

    return netRealEstateAssets;
  };
}

查询不使用域层,那么我可以把这个业务规则放在哪里? (也许稍后在命令的域层中相同)

谢谢。

【问题讨论】:

    标签: architecture domain-driven-design cqrs


    【解决方案1】:

    CQRS 的关键租户之一是您有单独的查询与更新/命令模型。您的域对象将被分离,并且附加了单独的业务规则。这里的关键是,如果您使用的是 DDD,您的查询将有一个域层,只是与您的命令端不同。

    如果您通过分离的命令和查询模型没有看到很多价值,那么您可能不需要使用 CQRS,并且应该规范化为单个模型。 CQRS 旨在用于命令模式与查询模式非常不同的场景。如果您在两个模型之间重复代码,那么您的系统可能不适合这种模式。

    https://martinfowler.com/bliki/CQRS.html

    【讨论】:

    • Eager Read Derivation (martinfowler.com/bliki/EagerReadDerivation.html) 不是一个好的解决方案?
    • 当然,但是 Eager Read 要求您的数据已经按照您的需要进行结构化。域逻辑存在于事物的写入端,而不是读取端。最终情况相同,您有一个正在塑造数据的域模型,但塑造的数据被写入。它实际上是查询模型域对象的序列化缓存。这就是为什么他们在退出数据库时不需要另一个模型,该模型已经被应用了。
    猜你喜欢
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 2012-01-03
    • 2016-09-17
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多