有一个small book I read last year by Steve Sanderson himself向我简要介绍了DDD的概念。尽管本书是以ASP.NET MVC为预览版的,但他确实将MVC中的“M”作为一个真正的纯粹的领域模型 - 使用了近1/2的关于建模方法的书(我非常喜欢)。他接触到的一件事就是在聚合根的上下文中使用Value Objects(显然)。但是,他还展示了如何使用Linq来表示实体以及价值对象。
问题是,他指出了Linq的限制,即它必须在每个对象上都有一个标识,包括值对象。他承认它打破了纯领域模型的方法;但是,这是使它与Linq-to-SQL一起工作的唯一方法。
他的解决方法是给你的价值对象一个身份;但是,请将该身份内部化,以免暴露在模型之外。这将允许您在存储库中使用Linq链接和共享您的对象;而不会将它暴露给客户层 - 因此,它就好比它们是Value Objects的独占。
我相信实体框架遭受同样的要求。
C#示例如下。
public class MyEntity
{
[Column(IsPrimaryKey = true
, IsDbGenerated = true
, AutoSync = AutoSync.OnInsert)]
public int EntityID { get; set; }
[Column(CanBeNull = false)]
public string EntityProperty
{
get
{
// insert business rules here, if need be
}
set;
}
}
public class MyValueObjectForMyEntity
{
// make your identity internal
[Column(IsPrimaryKey = true
, IsDbGenerated = true
, AutoSync = AutoSync.OnInsert)]
internal int ValueObjectID { get; set; }
// everything else public
[Column(CanBeNull = false)]
public string MyProperty { get; set; }
}