【问题标题】:where to instantiate simple values /entity objects? DDD在哪里实例化简单的值/实体对象? DDD
【发布时间】:2015-10-21 03:46:43
【问题描述】:

使用领域驱动设计,简单的值对象/实体在哪里实例化?

例如,如果我需要在服务类中创建一个简单的值对象,我是否只需在值对象的类上调用 new 运算符,将其耦合到服务类?

可以根据领域驱动设计在服务类中调用新操作符吗?

这些值对象不能通过 DI 容器注入,并且由于它们的简单性,它们不保证使用工厂。

【问题讨论】:

  • 这与领域驱动设计有什么关系?你的问题不清楚。您为什么不在相关的类中实例化这些值?请向我们展示一些代码和/或示例。
  • 不清楚。我会编辑它。但是,我想要一个松散耦合的设计,所以我不能直接在使用它们的方法中实例化它们,我需要将它们传递进去。因此,如果它们是基本对象而不是基本对象,我需要知道在哪里实例化它们需要使用工厂的复杂聚合体。

标签: java design-patterns domain-driven-design design-principles


【解决方案1】:

直接从构造函数实例化它们有什么问题?

通常您只需要在实例化过程很复杂或者您希望让客户端免于选择具体类时才需要工厂。

但是,由于通用语言在 DDD 中至关重要,因此聚合具有工厂方法来创建与其相关的其他聚合是很常见的。

例如,而不是像下面这样凭空产生项目任务:

var task = new Task(projectId, ...);

你可以这样做:

var task = project.addTask(...);

这将更好地表达“可以将任务添加到项目”用例,但必须以加载Project 聚合为代价。

【讨论】:

  • 我想知道在哪里创建简单的值对象。我知道它们可以从存储库中创建并由应用程序的客户端传入,但是当我的服务需要创建自己的服务时呢?我如何在不紧密耦合类的情况下做到这一点?如果它们如此简单以至于工厂会矫枉过正,那么我在哪里创建它们?它们不能通过 DI 容器注入,因为它们是值对象。
  • @Bojs 我真的不明白你的意思是在哪里?您只需在需要它们的地方实例化它们。您要问的问题与我在应用程序中在哪里创建字符串、整数、日期等相同......这没有任何意义。您显然会与 VO 紧密耦合。
  • 这是领域驱动设计的标准做法吗?有任何可以分享到在线资料的链接吗?
  • @Bojs 你的问题太不清楚了。什么困扰你?
  • Bojs,您在松散耦合方面做得太过分了。领域对象不应该松散耦合,因为它们本质上是具体的、单一的东西。请参阅stackoverflow.com/questions/16972974/…stackoverflow.com/questions/16041804/…(关于实体,但对 VO 也是如此)
猜你喜欢
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 2012-07-08
  • 2012-04-01
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 2013-01-02
相关资源
最近更新 更多