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

C# 将关键字建模为产品聚合中的价值对象是一个好主意吗?,c#,domain-driven-design,aggregate,value-objects,C#,Domain Driven Design,Aggregate,Value Objects,我有产品聚合,其中有几个关键字,以帮助搜索产品。我将其建模如下: public class Product : Entity<Guid,Product> , IAggregateRoot { public Guid AccountId { get; protected set; } public string Title { get; protected set; } public DateTimeOffset AddingDate { get; prot

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

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.值对象是不可变的

但出于搜索目的,我将使用推荐的product table存储多对多关键字,而不是逗号分隔的字符串

所以我的目标是将关键字建模为值对象,因为我不关心它的标识它是自动生成的整数还是Guid,也不关心通过它们的attribute(这里是Title)将两个关键字标记为相等

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

编辑:

根据上文我提供的文章:

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


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

我认为我甚至不会在域中设置关键字

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

您可能希望在UI上单独管理关键字

您可以更进一步,并且非常容易地拥有一个通用的子域标记/关键字存储库,其中任何Id(比如Guid)都可以有一个关键字或标记列表。通过这种方式,您可以将关键字与任何真正重要的内容关联起来


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

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

无论如何,如果您不使用谓词,您可以创建一个带有搜索关键字的值对象,比如DTO,它将与聚合一样位于同一个模块中


希望这个解释能有所帮助。

是的,我同意你的看法,他们没有任何业务规则,但它们是产品集合的一部分,在用户界面中,当供应商需要向其商店添加新产品时,他应该向他们提供亚马逊这样做您的用户界面可以收集各种数据,但如何组装、存储、,这些位可以用各种方式设计。很有可能获取关键字并将它们链接到某个将产品与关键字关联的数据存储中。但设计应该是合理的。例如,如果你打算将关键字与不同的实体相关联,我的例子不是你的,那么在每个实体类上都有一个关键字列表会变得有点痛苦。你的意思是说,例如,我应该检查产品不变量,然后在添加它之后,我可以使用存储库添加相关关键字,以便在产品聚合之外添加关键字??为什么你们介意在产品表中使用多对多的关键字呢?是的,这正是我的意思。您可以单独添加关键字,甚至可以单独维护。就像这里一样,我关注的标签与我的个人资料分开维护。它们当然仍然链接到我的个人资料,甚至可能在个人资料页面上,但我不需要编辑我的个人资料来维护该列表。我不介意使用多对多的关键字:-结果会是这样的,但由于关键字不是实体,因此在传统意义上它不是真正的多对多。一个产品仅仅有一个关键字列表……一个标签很可能是一个实体。所以他们实际上是。它们的描述可能会随着时间的推移而改变,等等。