【问题标题】:Value object retrieved from a separate data source?从单独的数据源检索的值对象?
【发布时间】:2013-03-19 17:00:19
【问题描述】:

我正在开发一个系统来为流程建模。 Process 的一个属性是它的速率。我认为 Rate 是一个值对象,因为它没有特定的身份。这个费率是从我不拥有的服务(想想 SOA,而不是 DDD 服务)中检索的。对于每种类型的流程,服务可能会有所不同,因为流程有团队和服务来支持他们保存我想要的数据。如何在 DDD 中组织它?

这里有一些代码可以帮助解释:

class Process
{
    private final Rate rate;
    ...

    public Process( Rate rate )
    {
        this.rate = rate;
    }

    public Rate getRate()
    {
        return this.rate;
    }
    ...
}

class ProcessFactory
{
    public Process createProcess( ProcessSpecification spec );
}

class ProcessRepository
{
    public Process getProcessByName( String name );
}

如果 ProcessSpecification 包含一个 RateSpecification,它描述了调用哪个服务来获取费率,ProcessRepository 是否应该负责了解如何从各种其他服务加载费率?

【问题讨论】:

    标签: domain-driven-design soa


    【解决方案1】:

    如果Process 是一个聚合,并且聚合用作一致性边界,那么它不应引用来自其他来源的数据。相反,您可以在创建 Process 时检索适当的 Rate 值,并将其与聚合的其余部分一起保存。

    如果进程的速率在 Process 聚合范围之外发生变化,那么您可能需要一种同步机制来轮询来自服务的速率值并相应地更新 Process 聚合。在这种情况下,速率值仍与聚合的其余部分一起存储。

    此外,如果速率值仅用于显示目的,那么它不应该是 Process 聚合的一部分,即使它在概念上是它的一部分。在这种情况下,只需在需要显示费率时调用服务即可。如果性能是一个问题,可以使用缓存。

    【讨论】:

    • 谢谢。那么,我想 Rate 也可以是一个汇总。我的系统将跟踪从我的进程名称到适当参数的映射,以提供给其他来源。该映射是一个值对象,因为我将它与我的流程一起保存。 Rate 并没有真正的标识符,但它对我在请求中提供的参数和时间范围是唯一的(几乎类似于工厂,但工厂实现是远程的)。最终,我正在构建具有静态关系的流程模型及其不断变化的速率。
    • 关于您上一条评论的进一步问题:如果我调用这样的服务,就 DDD 术语而言,该服务和由此产生的费率将扮演什么角色?现实是否与 DDD 中的角色/概念没有很好的对应关系?我不认为我是在要求按身份提供费率,它更像是一个“给我在这个时间跨度内处理的单位数量”的问题,所以费率甚至没有被其他系统明确存储。
    • 经过一些实验和讨论,接受这个,因为将 Rate 从 Process 聚合中移出的想法很有意义。需要时(创建和/或重构),通过RateService 检索费率。在我的上游系统中,Rate 将显示为一个值对象,但在我的系统中,我将它从另一个有界上下文转换为我自己的 BC。
    猜你喜欢
    • 2014-03-12
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多