去年我读了一本史蒂夫·桑德森(Steve Sanderson)自己写的小书,向我介绍了 DDD 的概念。尽管这本书是关于 ASP.NET MVC 的预览版,但他真正关注的是 MVC 中的“M”作为一个真正的纯领域模型——使用了这本书的近 1/2 的建模方法(我非常喜欢)。他接近的一件事是在聚合根的上下文中使用值对象(显然)。但是,他还展示了如何使用 Linq 来表示实体以及值对象。
关键是,他指出了 Linq 的局限性,即它必须在每个对象上都有一个标识,包括值对象。他承认它打破了纯领域模型方法。但是,这是让它与 Linq-to-SQL 一起工作的唯一方法。
他的解决方法是给你的价值对象一个身份;但是,将该身份设置为内部的,这样它就不会暴露在您的模型之外。这将允许您在存储库中使用 Linq 链接和共享您的对象;虽然不将其暴露给客户端层 - 所以,就好像它们是专门的值对象。
我相信实体框架也有同样的要求。
AC# 示例如下。
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; }
}