2

ビジネス モデルを構築するときに最も多くの時間を費やしていると思うのは、ビジネス エンティティの検証と、エンティティ オブジェクトとその関係が適切な整合性を維持していることを確認することです。優れたエンティティ/値オブジェクト フレームワークに対する私の夢は、再利用可能なエンティティ/値オブジェクトを作成し、データベースで行うように関係の制約とルールを簡単に作成するのに役立ちますが、これは本当にビジネス ルールであると感じているため、モデルに属し、そうあるべきです。データベースから完全に独立しています。

Person オブジェクトの Name プロパティが必須であること、Email プロパティが必須であること、および特定の正規表現に一致すること、およびこれらのルールが簡単に再利用可能であることを簡単に定義できる必要があります。私のWebアプリで入力を検証する際に。

私はLinq to sqlの経験が最も豊富で、値オブジェクトなどをサポートしていないため、操作するのは確かに良いことですが、制限があります。私の質問は、エンティティ フレームワークまたは NHibernate がより適しているか、それとも私のニーズにより適した他のテクノロジがあるかということです。

4

2 に答える 2

0

あなたは世界の.Net側にいるように見えますが、EricEvansの本「DomainDrivenDesign」を強くお勧めします。(実際にはJavaよりも多くのUMLがあり、アイデアは移植する必要があります。)

これはパターンブックですが、彼は、すべてのオブジェクトルールロジック(「不変条件」)を一元化されたドメインに固定することを主張するいくつかの設計戦略を提案しています。その後、彼は一般的に理解されているいくつかのパターンについてリフし、あなたのような問題をより扱いやすくします。まあ、扱いにくいとは言え、少なくとも長期的にはもっと扱いやすい。

于 2009-03-31T04:47:32.100 に答える
0

昨年、スティーブ・サンダーソン自身が読んだ小さな本があり、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; }
}
于 2009-03-19T18:30:20.957 に答える