2009-09-08 5 views
5

私はPro ASP.NET MVC Framework、Steven Sandersonを読んでいます。第11章では、データ検証について説明します。データまたはドメイン層のルール検証?

ページのモデルレイヤーへの検証ロジックの移動を参照してください。このセクションでは、392ページに、検証の実装方法を示すコードをいくつか示します。

コードはGetRuleViolations()メソッドを実装し、Save()メソッドは何か問題がない場合はRuleExceptionをスローするためにこのメソッドを使用します。ドメイン・レイヤーとデータアクセス層の間に区別がないことを

それは、しかし、私には見えますが、ここではコードです:私が働いているプロジェクトで

public void Save() { 
    var errors = GetRuleViolations(); 
    if (errors.Count > 0) 
     throw new RuleException(errors); 

    // Todo: Now actually save to the database or whatever 
} 
private NameValueCollection GetRuleViolations() { 
    // validations... 
} 

、私はを持っていますドメイン層は、できるだけ永続性を知らないままであり、データアクセス層であり、NHibernateを介してデータアクセスを実装し、ドメイン層で定義されたインタフェースを実装しています。

ここで提案者が提案した「Save()」メソッドで検証ルールを実装すると、データアクセスレイヤーに移行することになりますが、ドメインモデルに置く必要があります。

だから、私の質問はです:リポジトリ(永続無知)へのインターフェースをドメインエンティティを実装し、露光しドメイン層で、層状のアプリケーションを作成するときに、からリポジトリを実装データアクセス層ドメイン層とすべてのデータアクセスコードを実装するここで、検証ルールはどこにあるのですか

私のプライマリ(または少なくとも最初の)のインターフェイスは、何かを変更する可能性がある場合、ASP.NET MVCアプリケーションになります。

ありがとうございました。

+0

私は実際には私の心の中で戦う2つの発想があります:(1)新しいDALを書くことに決めたら、同じルール(DRY)をすべて書き直したくないです。ルールを逃したり、エラー、またはすべての新しいルールを複数回再実装する必要があります。 (2)ドメイン上で「文脈検証」を実装するのは難しいでしょう(私はそれを処理するたびにドメイン上のコンテキストに関する詳細を注入しなければならないので)... –

答えて

2

、M(モデル)両方ドメイン層データアクセス層を含みます。だから、サンダーソンの例には何も問題はありません。

つまり、これらの両方のレイヤー(1つではなく)を使用してドメインモデルを実装すると、バリデーションロジックがドメインレイヤーに移動してドメインオブジェクトの結束性を高め、多くの場所で例えば、それぞれの具体的なリポジトリに)。

+1

私は同意しますが、 "コンテキスト検証"はどうですか?たとえば、ドメインオブジェクトは有効ですが、永続化する準備ができていますが、ユーザーのウィンドウから赤い車が見える場合は、オブジェクトを保存することはできません。このルールは、*保存*操作の場所/時間に関するコンテキスト情報を運びます。この情報は、近くに駐車しているすべての車(つまり、あなたのプロジェクトにないもの)のリストを提供するサービスから来ます。この妥当性確認規則はどこで施行されるのですが、DRY原則に従いますか? –

+0

保存を実行するサービスのメソッド内。私は通常、ASP.NET MVCアプリケーションでこれらのレイヤーを持っています:コントローラ - >サービス - >リポジトリ。ドメインオブジェクトはこれらのレイヤー全体で使用されます。サービス(コントローラではない)は、ドメインオブジェクトの検証を開始する必要があります。コンテキスト・バリデーションは、ドメイン・オブジェクトを保存する前にサービスによって実行されます。これらのすべてのもの(サービス、リポジトリ、ドメインオブジェクト、つまりエンティティ)は、ドメイン駆動設計の概念です。なぜドライ?例えば。これらのすべて(サービス、リポジトリ、エンティティ)を変更せずにWebFormsアプリケーションで再利用することができます。 –

+1

Buu Nguyen:Martin Fowler氏は、「サービスでより多くの行動が見つかるほど、ドメインモデルの利点を奪う可能性が高くなります。すべてのロジックがサービス中であれば、あなたは盲目的に" (http://martinfowler.com/bliki/AnemicDomainModel.html)、あなたのモデルは貧血だと言った。 – BrunoSalvino

1

彼らは間違いなくあなたのドメイン層に属しています(ここではIDataErrorInfoを実装することができますが、これはWindowsフォームやWPFアプリケーションにとっては役に立ちます)。

この検証哲学はPaul Stovell(チェックアウトthis article of his)によって公開されているものと非常に似ています。それは非常に強力で、私はそれをたくさん使っています。基本的には:限り、あなたがそれを保持しようとしないよう、無効なビジネスオブジェクトを持つには何の問題も

  1. はありません。
  2. ビジネス・オブジェクトからすべての破損したルールを取得できる必要があります。データ・バインディングと独自のコードによって、エラーがあるかどうかを確認して適切に処理できるようにします。

だから、あなたのドメイン・レイヤーほど無知な私はあなたのエンティティは、彼らが永続化されているときの、少なくとも知っておくべきだと考え、持続性の問題です。 Saveメソッドは、独自の永続性(後でデータアクセスレイヤ)に委任できるようにする方法です。私はこれに間違って何かを見ることができません。

+0

Jimmy Nilssonが書いているように私は同意しません彼のDDD本「すべての州、たとえ誤りがあっても、保存可能でなければならない」。彼が使用している例は次のとおりです。「ユーザーは、エラーのために現在の変更を保存できないことをアプリケーションから覚えていません。私の友人は、スペルミスがあればワープロ文書を保存できないということと比較しています。 – BrunoSalvino

0

私は通常、常に有効ドメインオブジェクトを優先します。 ドメインオブジェクトは、オブジェクトが無効にならないようにする方法でのみ変更できます。

プレゼンテーションオブジェクトには、一時的な無効な値や、正しく解析できない値が含まれていることがあります。しかし、メソッド呼び出しは、データが有効なときにプレゼンテーションレイヤーによってのみドメインオブジェクトに発行されます。

ドメインオブジェクトは不変条件を強制し、プレゼンテーションオブジェクトは、制約を考慮してその入力をどのように変更すべきかをユーザーに示します。 MVCアーキテクチャで

0

ドメイン層で検証を行う必要があります。ビジネスロジックは、データアクセスではなくドメインの一部です。検証は、ドメインオブジェクト自体(実際のクラス)の内部で行うことはできませんが、ドメインレイヤー内に存在する必要があります。

関連する問題