2012-01-05 12 views
9

Webベースのmvc3 .netアプリケーションで使用するには、どの検証フレームワークをお勧めしますか?アプリケーションはドメインモデルのパターンとドメインモデルに従います。POCOは別のクラスライブラリにありますか?.netプロジェクトにはどのような検証フレームワークをお勧めしますか?

必要となります検証の並べ替えは、私がFluentValidationとなるだろう... nullではない、正規表現ベースなど

+0

異なるフレームワークの利点/欠点の比較を見つけましたか? –

答えて

18

だろう、それは素晴らしいオープンソースプロジェクト

https://github.com/JeremySkinner/FluentValidation

だそれはです

+0

spring.netはどうですか? – InfoLearner

+0

@KnowledgeSeekerは私にとっては不必要に複雑に思えました。しかし、私は実際のプロジェクトでそれについて正当な意見を述べることはしませんでした。私が言うことができるのは、FluentValidationがmvcプロジェクトのためのすばらしいソリューションのように思えることです。 –

+0

EntLib検証アプリケーションブロックの経験はありますか?はい、FluentValidationを好む理由は? –

3

例外のリストが必要な場合(かつ例外ではありません)、エンタープライズライブラリ検証ブロックが好きです。あなたはPOCOオブジェクトに対する最も基本的な検証を配線することができ http://msdn.microsoft.com/en-us/library/ff650484.aspx

はでPowerPointプレゼンテーションを参照してください。 プリファブルールの多くは.configファイルで設定できます。

あなた自身のルールを書くことができます。

私のルールは非常にきめ細かです。彼らは一度に1つの検証を行います。

単純な例として、私は従業員が(誕生日に基づいて)雇用可能かどうかを判断するために2つの異なるルールを持っています。 従業員の生年月日が指定されているかどうかを1つのルールで確認します。
第2のルールは、現在の日付から誕生日を差し引いたものが18歳を超えていることを確認します。 (またはルールが何であったとしても)。

(ここでは、ルールの束があるとします)。 検証ルーチンが実行された後、リスト内のすべての(無効な)状況のリストが返されます。たとえば、私が従業員を検証していた場合、私は犠牲者のリストを取得します。

"姓を提供していませんでした"

"姓を提供していませんでした"

"SSNを提供していませんでした" ではなく "一度に一つ" の

。 (「一度に1つ」を行うと、最終的にあなたの小切手の有効性を理解するために潜在的に多数のパスが取られます)。

以下はいくつかのサンプルコードです。誰かがISBN「ABC123456」で書籍を購入しようとしたとしましょう。

以下は、その書籍が存在するかどうか(たとえば、製品データベースなど)を確認するカスタムルールです。私はあなたが一緒に従うことができると思います。これはBook(.cs)pocoオブジェクトに対して配線されます。 (「ワイヤアップ」は表示されません)。私は単純なルールを作成するのがどれほど難しいか(または難しくないか)という簡単な例をあなたに伝えようとしています。

書籍が見つからない場合(isbnを使用している場合)は、validationResults.AddResultメソッドが表示されます。それはあなたが複数の犠牲者を得る方法です。後で検証クエリを確認するときにコレクションにアクセスできます。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Text.RegularExpressions; 

using Microsoft.Practices.EnterpriseLibrary.Validation; 
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators; 


namespace MyCompany.Applications.MyApplication.BusinessLogic.Validation.MyType1Validations 
{ 
    [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] 
    public class BookExistsValidatorAttribute : ValidatorAttribute 
    { 
     protected override Validator DoCreateValidator(Type targetType) 
     { 
      return new BookExistsValidator("BookExistsValidatorTag"); 
     } 
    } 

    public class BookExistsValidator : Validator<string> 
    { 

     public BookExistsValidator(string tag) : base("BookExistsValidatorMessageTemplate", tag) { } 

     protected override string DefaultMessageTemplate 
     { 
      get { throw new NotImplementedException(); } 
     } 

     protected override void DoValidate(string objectToValidate, object currentTarget, string key, ValidationResults validationResults) 
     { 

      bool bookExists = BookMatchExists(objectToValidate); 

      if (!bookExists) 
      { 
       string msg = string.Format("The Book does not exist. Your ISBN='{0}'", objectToValidate); 
       validationResults.AddResult(new ValidationResult(msg, currentTarget, key, 10001, this)); /* 10001 is just some number I made up */ 

      } 


     } 

     private bool BookMatchExists(string isbn) 
     { 
      bool returnValue = false; 

      IBookCollection coll = MyCompany.Applications.MyApplication.BusinessLogic.CachedControllers.BookController.FindAll(); /* Code not shown, but this would hit the db and return poco objects of books*/ 

      IBook foundBook = (from item in coll where item.ISBN.Equals(book, StringComparison.OrdinalIgnoreCase) select item).SingleOrDefault(); 

      if (null != foundBook) 
      { 
       returnValue = true; 
      } 
      return returnValue; 
     } 



    } 
} 
+0

spring.net検証フレームワークを使用しましたか? – InfoLearner

+1

いいえ。私はEnterpriseLibraryを使い始めて、約2日で必要なものを手に入れることができたと考えました。参照:http://stackoverflow.com/questions/3806447/spring-net-vs-enterprise-libraryおよびhttp://stackoverflow.com/questions/751700/which-validation-framework-to-choose-spring-validation- 2つのコメントについては、検証または検証アプリケーションを参照してください。エンタープライズライブラリは常に優れたサポートとドキュメントを持っていました。私はすでにE.L.Dataを使用していたので、Validationブロックを使用するのは簡単でした。 – granadaCoder

関連する問題