由于几个原因,在 DDD 和 ORM 的上下文中,深层继承层次结构存在问题。当您尝试定义实体的身份时,就会出现一个问题。AProduct
必须基于身份与其他产品进行比较,无论要比较哪个子类。可以在Product
类中提供此功能,但必须注意确保子类也可以进行比较,并且存在一些问题。例如,NHibernate 将为类生成一个代理,因此对象的实际运行时类型将不是NvidiaGraphicsCard
从它继承的代理。虽然临时实例NvidiaGraphicsCard
不会成为代理。这意味着您无法根据类型比较它们。
另一个困难是配置 ORM 映射以支持继承。虽然大多数 ORM 都允许这样做,但生成的映射和生成的 SQL 通常很复杂。您是否将所有子类存储在一个表中?在具有通用产品表外键的多个表中?在前者中,您最终会得到一张巨大的桌子。在后一种情况下,您的查询将受到影响,因为所有子类表都需要连接。关系模型和对象模型之间存在太多的阻抗不匹配。事件如果使用文档数据库,最好支持组合而不是继承。
Instead, I would go for having a single Product
class, which can be composed of either product specific descriptors, or a dictionary of attributes. This would an OrderItem
to reference a Product
without knowing the specific product type - no need for polymorphism. This would also make it easier to allow for new types of products - no need to create a new sub-class.