我有一个产品汇总,其中有多个关键字可以帮助您搜索产品。我将其建模如下:
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)。
我的问题是:我应该根据上述情况将关键字建模为值对象还是实体?为什么?
编辑:
根据我上面提供的文章:
不要为价值对象引入单独的表,只需将它们内联到父实体的表中即可。
应将关键字视为实体(但我认为域和数据库模型不应相互依赖)
答案 0 :(得分:1)
我认为即使在域中包含关键字也不会打扰。
它们似乎是各种分类器(从概念上讲)。如果我 did 在域中拥有它,我将有一个简单的string
列表。但是同样,这些关键字可能几乎没有业务价值,并且可能没有任何关联的规则。我猜想它们有助于搜索特定产品。
您可能仍然希望在用户界面上分别“管理”关键字。
您甚至可以更轻松地使用通用的(也许是子域)Tag
/ Keyword
“存储库”,其中任何Id
(例如Guid
)可以包含关键字或标签列表。通过这种方式,您可以将关键字与真正的任何内容相关联。
将其发挥到极致,通用分类系统甚至可能有用...但这是另一个主题:)
答案 1 :(得分:0)
您可以将谓词定义为搜索方法的参数。并将与聚合有关的谓词放在聚合的模块中(作为DDD概念的模块),即Java程序包或命名空间(不确定Microsoft术语中的命名空间,我来自Java世界)。
无论如何,如果不使用谓词,则可以使用搜索关键字(例如DTO)创建值对象,并且该对象与聚合对象在同一模块中的使用效果也很好。
希望这种解释有所帮助。