2012-02-21 12 views
4

service layerを使用してドメインモデルを検証し、データベースに永続化する方法を研究しています。拡張メソッドを使用してドメインモデルを検証する

私のモデルであるの拡張メソッドを使用してfollowing exampleが見つかりましたが、具体的な欠点があるかどうか疑問に思っていました?私は検証(データ注釈を除いて)はそれほど多くは言及していません。

私は、次の実装を考えていた:私は、これは/推奨あまり実装され表示されないよう

public class FooService : IFooService { 

    public bool Add(Foo foo) { 

     if (!foo.IsValid()) { 
      return false 
     } 

     try ... catch 
    } 
} 

public static class validationExtensions { 

    public static bool IsValid(this Foo foo) { 

     // Call my validation implementation here 
    } 
} 

私は、これを行うには緊張しています。思考?

答えて

13

ドメインオブジェクトは自己検証する必要があります。これは簡単なOOPです。彼らは最初に無効な状態になることを許されるべきではありません。適切に設計されたドメインオブジェクトは、外部コードに頼ることなくすべての内部不変条件を強制します。さもなければ、カプセル化は壊れてしまい、あなたのオブジェクトは実際にはgetterとsetterを持つばかばかしいデータコンテナに過ぎません。

「検証」という言葉は、ドメインやオブジェクトからUIフレームワークの選択肢に合わせたダムのデータコンテナにフォーカスを移す傾向がある、非常に危険な過大化でもあります。このため、DDD bookには「検証」の問題はまったく言及されていません。 の不変式については、約検証よりも考えるほうが便利です。不変量は、 '社会保障番号には手紙を使用できません。'のように簡単なものにすることができます。その場合はValue objectを使用します。または「注文のような複雑なものは、order.IsDelinquent()または同様の方法でカプセル化できる2週間以内に支払われなかった場合、延滞しているとみなされます。 '最初のケースでは、SocialSecurityNumberクラスを実装することによって、オブジェクトが無効になる可能性を排除することに注意してください。 2番目のケースでは、一般的な「有効」の代わりに「延滞」という語をubiquitous languageから使用しています。類似の回答を参照してください:123

補足として、塩分を含んだASP.NET群衆のすべての「DDD」アドバイスを取るべきでしょう。 ASP.NET MVCは偉大なフレームワークですが、教材はドメインモデルをViewモデルと混同します。ほとんどの例では、 'ドメイン'オブジェクトは、getterとsetterを持つデータコンテナと同じであるとみなされ、カプセル化は行われません。 DDDはテクノロジーにとらわれないので、コンソールアプリでこれが意味をなさないと自分自身に問いかけることで、常に現実感をチェックできます。または 'これはUI以外のプロジェクトで意味をなさないでしょうか?'

+2

これはすばらしい答えであり、私にとってDDDについての新たな洞察をもたらします。ありがとうございました。 – Matt

関連する問題