在产品汇总中将关键字建模为价值对象是一个好主意吗?

时间:2018-10-20 09:15:55

标签: 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; 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。如果两个值对象具有相同的属性值,则认为它们相等。
2.Value对象的寿命为零。
3.Value对象是不可变的。

但是出于搜索目的,我将按照推荐的Here和产品表存储多对多关键字,而不是用逗号分隔的字符串。

所以我的目标是将关键字建模为值对象,因为我不在乎其身份(无论它是自动生成的整数还是Guid),也不关心两个关键字的属性是否相等(此处为Title)。

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

编辑:

根据我上面提供的文章:

  

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

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

2 个答案:

答案 0 :(得分:1)

我认为即使在域中包含关键字也不会打扰。

它们似乎是各种分类器(从概念上讲)。如果我 did 在域中拥有它,我将有一个简单的string列表。但是同样,这些关键字可能几乎没有业务价值,并且可能没有任何关联的规则。我猜想它们有助于搜索特定产品。

您可能仍然希望在用户界面上分别“管理”关键字。

您甚至可以更轻松地使用通用的(也许是子域)Tag / Keyword“存储库”,其中任何Id(例如Guid )可以包含关键字或标签列表。通过这种方式,您可以将关键字与真正的任何内容相关联。

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

答案 1 :(得分:0)

您可以将谓词定义为搜索方法的参数。并将与聚合有关的谓词放在聚合的模块中(作为DDD概念的模块),即Java程序包或命名空间(不确定Microsoft术语中的命名空间,我来自Java世界)。

无论如何,如果不使用谓词,则可以使用搜索关键字(例如DTO)创建值对象,并且该对象与聚合对象在同一模块中的使用效果也很好。

希望这种解释有所帮助。