2012-01-14 11 views
2

TDDを使用してMVCサイトを構築しています。サービス層で入力を検証するにはどうすればよいですか

私はPOCOクラスのCRUD操作を処理するために、リポジトリとサービスレイヤの作成を開始しました。

コントローラーコードはまだ書いていませんし、ページにフォームの値などをポストしてコントローラーに送り、タイプに変換せずにそのままサービスレイヤーに渡すことを考えていました。

var content = ContentSevice.CreateContent(name: ValidContentName, contentTypeId: ValidContentTypeId, languageId: ValidLanguageId, author: ValidAuthor); 

言語やコンテンツの種類などのオブジェクトを作成する管理サービスもあります。

これらのメソッドへの入力を検証すると、そのオブジェクトの作成メソッドと編集メソッドの間で多くの情報が複製されます。一部のパラメータはユニークですが、

繰り返しコードを保存するには、共通部分の検証方法を抽出します。これは単にValidateLanguageNameとValidatePropertyTypeNameなどがあることを意味します。

これはこの匂いがします。

オブジェクトの入力を検証するにはどうすればよいですか?私はLanguageValidatorのようなオブジェクトごとにいくつかの他のサービスやクラスを考えていましたか?

パラメータはクライアント側で検証を使用しますが、コントローラーでもサービスレイヤで検証したいと思いますが、これはコードがTDDの観点から判明したもので、コントローラメソッドタイプを知る必要があります。

答えて

3

原因検証はクロスカッティングの問題です。コードとレイヤー全体に渡って呼び出すことができます。それを配置して呼び出す場所が1つあり、単純なケースではオブジェクトそのものにする必要があります。

最初のアドバイスは、引数の束ではなくオブジェクトをサービスに送信し、次に メソッド名IsValid()内のオブジェクトに検証ロジックを入れ、そのルールをチェックしてメッセージのリストを返すか、すべての小道具名とエラーメッセージの辞書。

+0

サービス層を持つ目的を破るのは、すべての私のビジネスロジックがそこにあります。 –

+0

まったく反対ではなく、貧血ドメインモデルと呼ばれる反パターンがあります。http://martinfowler.com/bliki/AnemicDomainModel.htmlおよびこちらhttp://en.wikipedia.org/wiki/ Anemic_domain_model –

+0

変更が必要になった場合は、コードベースを一度に改訂しないでください。少しずつリファクタリングしてください。 –

関連する問題