将关键字建模为产品聚合中的值对象是个好主意吗?



我有产品聚合,其中有几个关键字可以帮助搜索产品。我将其建模如下:

public class Product : Entity<Guid,Product> , IAggregateRoot
{
public Guid AccountId { get; protected set; }
public string Title { get; protected set; }
public DateTimeOffset AddingDate { get; protected set; }
public decimal Price { get; protected set; }
public string Brand { get; protected set; }
public string Description { get; protected set; }
public IList<Keyword> Keywords { get; protected set; }
}
public class Keyword : ValueObject<Keyword> 
{
public Keyword(string title) 
{
this.Title = title;
}
public string Title { get; protected set; }
}

根据实体与值对象的最终差异列表,值对象具有以下几个特征:

1.如果两个值对象具有相同的属性值,则它们被视为相等。
2.值对象的生命周期为零。
3.值对象是不可变的。

但出于搜索目的,我将按照此处的建议将关键字存储为多对多的产品表,而不是逗号分隔的字符串。

所以我的目标是将关键字建模为值对象,因为我不关心它的身份(无论是自动生成的整数还是 Guid(,并且通过其属性将两个关键字标记为相等(这里是标题(。

我的问题是:我应该根据上述场景将关键字建模为值对象还是实体,为什么?

编辑:

根据我上面提供的文章:

不要为值对象引入单独的表,只需将它们内联到父实体的表中即可。

关键字应该被视为实体(但我认为域和数据库模型不应该相互依赖(

我认为我甚至不会打扰域中的关键字。

它们似乎是某种分类器(在相当概念的意义上(。 如果我确实在域中拥有它,我会有一个简单的string列表。 但同样,这些关键字可能几乎没有商业价值,并且可能没有任何与之关联的规则。 我猜它们有助于搜索特定产品。

无论如何,您可能希望在 UI 上单独"管理"关键字。

您可以更进一步,并且很容易拥有一个通用(可能是子域(Tag/Keyword"存储库",其中任何Id(例如Guid(都可以具有关键字或标签列表。 通过这种方式,您可以将关键字与任何内容相关联。

为了将这一点发挥到极致,通用分类系统甚至可能有用......但这是另一个话题:)

您可以将谓词定义为搜索方法的参数。并在聚合的模块(模块作为DDD概念(,.java即包或命名空间(不确定Microsoft术语中是否称为命名空间,我来自java世界(。

无论如何,如果您不使用谓词,则可以使用搜索关键字(如DTO(创建一个值对象,并且它将与聚合位于同一模块中。

希望这个解释有所帮助。

相关内容

最新更新