昨年、スティーブ・サンダーソン自身が読んだ小さな本があり、DDDの概念について説明してくれました。この本はプレビューとしてASP.NETMVCに掲載されていましたが、彼はMVCの「M」に真の純粋なドメインモデルとして焦点を当てていました。モデリングアプローチに関する本のほぼ1/2を使用しています(これは非常に楽しかったです)。彼がアプローチしたことの1つは、(明らかに)集約ルートのコンテキストで値オブジェクトを使用することでした。しかし、彼はまた、Linqを使用してエンティティと値オブジェクトを表す方法も示しました。
重要なのは、Linqには、値オブジェクトを含むすべてのオブジェクトでIDが必要であるという制限があることです。彼は、それが純粋なドメインモデルのアプローチを破ったことを認めました。しかし、それがLinq-to-SQLで動作するようにする唯一の方法でした。
彼の回避策は、値オブジェクトにアイデンティティを与えることでした。ただし、そのIDを内部にして、モデルの外部に公開されないようにします。これにより、リポジトリでLinqを使用してオブジェクトをリンクおよび共有できるようになります。クライアントレイヤーに公開していませんが、それはまるでそれらが排他的に値オブジェクトであるかのようです。
私が信じるEntityFrameworkも同じ要件に苦しんでいます。
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; }
}