在 DDD 中,保存列表的类可以是值类型吗?

发布于 2024-12-24 02:13:37 字数 372 浏览 1 评论 0原文

我重构了我的一个类,并定义了一个名为 SiteLicenseManager 的新类,该类向构成我的安装站点的计算机添加和删除许可证。

SiteLicenseManager 包含 LicenseType 对象的列表。每个对象的内容都会根据我们是否添加或删除许可证而发生变化。

现在,SiteLicenseManager 是值类型吗?

尽管 SiteLicenseManager 不会更改(不可变),但列表对象的内容确实会更改(我将它们作为值对象)。但是我注意到我确实将 LicenseType 对象添加到列表中,因此 SiteLicenseManager 实际上是可变的。

另外,我的域中只能有一个 SiteLicenseManager 实例。

京东

I have refactored one of my classes and defined a new class called SiteLicenseManager which adds and removes licenses to machines that make up my install site.

The SiteLicenseManager contains a list of LicenseType objects. The contents of each of these objects gets changed depending on if we are adding or removing licenses.

Now, is SiteLicenseManager a value type?

Although SiteLicenseManager does not change (immutable) the contents of the list objects do change (I have them as value objects). However I noticed that I do add LicenseType objects to the list so SiteLicenseManager is in fact mutable.

Also there can only be one SiteLicenseManager instance in my domain.

JD

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

青朷 2024-12-31 02:13:37

您应该根据其含义来决定您的类是值对象还是实体。如果您无法区分安装在不同站点上的相同许可证类型,那么听起来您的许可证类型集合确实是值对象。

对于值对象来说,SiteLicenseManager 并不是一个好名字。这个名字表明这个对象作用于其他对象。我将其称为 LicenseCollection 或类似的名称。

但是,让值对象在内部保存不可变列表(在您的情况下是许可证类型)绝对没问题。但是,您应该让这些列表不可变。

相反,您的值对象类应该具有通过返回此类的新实例来添加/删除许可证的操作。

就像这样:

class LicenseCollection {
  private readonly ReadOnlyCollection<LicenseType> types;

  LicenseCollection AddLicense(LicenseType type) {
    return new LicenseCollection(/* add new license type to your list */);
  }

  /* constructors etc */
}

每当您需要更改值对象时,您都可以通过创建新的更新实例来更新它。这与您所描述的类似,唯一的区别是您创建更新的副本而不是更改列表。

You should decide whether your class is value object or entity by its meaning. If you cannot distinguish between the same license types installed on different sites, it sounds like your license type collection is indeed value object.

SiteLicenseManager is not a good name for a value object. This name suggests that this objects acts on other objects. I would call it LicenseCollection or something like this.

However, it is absolutely fine to have value objects holding immutable lists inside (License types in your case). BUT, you should have these lists immutable.

Instead, your value object class should have operations that add/remove licenses by returning new instance of this class.

Something like:

class LicenseCollection {
  private readonly ReadOnlyCollection<LicenseType> types;

  LicenseCollection AddLicense(LicenseType type) {
    return new LicenseCollection(/* add new license type to your list */);
  }

  /* constructors etc */
}

Whenever you need to change your value object you update it by creating new updated instance. This is similar to what you described, with the only difference that instead of changing lists you create updated copies.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文