代码之家  ›  专栏  ›  技术社区  ›  Simple Code

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

  •  0
  • Simple Code  · 技术社区  · 6 年前

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

    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; }
     }
    

    取决于 entity-vs-value-object-the-ultimate-list-of-differences 值对象有几个特征:

    1.如果两个值对象具有相同的属性值,则认为它们相等。

    3.值对象是不可变的。

    但是为了便于搜索,我将根据推荐使用产品表存储尽可能多对多的关键字 Here 而不是逗号分隔的字符串。

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

    我的问题是:我应该将关键字建模为值对象还是实体,这取决于上面的场景和原因?

    编辑:

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   Eben Roux    6 年前

    我想我甚至不需要在域名里输入关键词。

    它们似乎是一种分类法(在概念上)。如果我 string 列表。但同样,这些关键字可能没有什么商业价值,也可能没有任何相关规则。我猜它们有助于搜索特定的产品。

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

    Tag / Keyword “存储库”中 Id (说a Guid )可以有关键字或标记的列表。这样你就可以把关键词和任何东西联系起来。

        2
  •  0
  •   choquero70    6 年前

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

    不管怎样,如果不使用谓词,您可以使用搜索关键字(如DTO)创建一个value对象,它将与聚合在同一个模块中。

    希望这个解释有帮助。

    推荐文章