有一個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; }
}