2012-08-04 6 views
5

私は別のプロジェクトでそれを使用するための検証コンポーネントを書くつもりです。私はエンタープライズライブラリVABFluentCuttingEdge.Conditionsなど多くの他のバリデーションフレームワークにはあまり精通していませんが、自分の目的に適しているかどうかを確認する時間はありません。WCFとWebServiceメソッドのパラメータ値を検証する最良の方法

私は、このコンポーネントが私のために2つの異なる機能を提供します:

まず、私は私はいつでも私はそれらを使用することができ、その上EmailValidator、StringLengthValidator、MyCustomValidatorなど、いくつかのバリデータを持ちたいです以下のようなコード、:

public class EmailValidator : RegexValidator // or StringValidator or whatever! 
{ 
    public EmailValidator() : base("emailRegexHere") 
    { 
    } 
public bool override DoValidate(string value) 
    { 
     return base.DoValidate(value); 
    } 
} 
... 

public void MyMethod(string email) 
{ 
    EmailValidator validator = new EmailValidator(); 
    if(!validator.Validate(email)) 
     throw new NotValidatedException("email is invalid."); 
    ... 
} 

第二、私は余分なコーディングなしで私が好きなメソッドパラメータにDataAnnotationsのようなものを適用することにより、パラメータを検証する必要があります。私が知っている可能な方法の1つは、PostSharpを使ってAspectを作成し、メソッドの開始位置(OnMethodEntry)にコードを挿入することです。私はPostsharpでロギングをやってきました。

また、MicrosoftはIParameterInspectorをPerform Input Validation in WCFに導入してBeforCallとAfterCallの2つのメソッドを提供していますが、WCFのみで動作すると思います。

アップラップするために、私はこのような私のWCFやWebサービスで検証を実行する必要があります。

[System.Web.Script.Services.ScriptService] 
public class MyServiceClass : System.Web.Services.WebService 
{ 
    [Aspects.Validate] 
    [WebMethod(EnableSession = true)] 
    public string SubmitComment([Validation.Required]string content,[Validation.Guid] string userId,[Validation.Required] [Validation.Name]string name, [Validation.Email]string email, string ipAddress) 
    { 
     ... 
    } 
} 

:これは私が必要とする動作を実証するだけのサンプルコードで、任意の他の提案されましたよく感謝します。また、Validation。*アノテーションをValidateParam(typeof(EmailValidator))のような1つのアノテーションに変更するのも良い考えですか?事前に

おかげ

答えて

3

うん、私はちょうどこのためPostSharpになります。メソッドのパラメータ(検証方法を示す属性の場合)と引数(検証する値)を調べるOnMethodBoundaryAspectまたはMethodInterceptionAspect

以前はOnMethodBoundaryAspectを使用していたので、MethodExecutionArgsのドキュメントをご覧ください。メソッド情報はargs.Method(System.ReflectionにあるMethodBaseを返します)で取得できます。 GetParameters()を呼び出すと、ParameterInfoの配列が返されます。それぞれのParameterInfoオブジェクトでは、Attributesプロパティで属性に関する情報を取得できます。

あなたが属性を知ったら、あなたはその後、メソッドが使用する検証を知っている(または独自の属性を作成している場合、検証メソッドは、これらの属性クラスで自分自身することができます)。引数の値を取得するには、args.Argumentsを使用する必要があります。

実際のコードではありません:詳細は、あなたが自分自身をうまくする必要があります。ここ

は、いくつかの(擬似)コードです。

追加の検証タイプを追加するためにアスペクトを変更する必要がないので、検証コードを属性自体に入れるというアイデアが気に入っています。

+1

これはまさに私が心に留めていたことであり、私はほとんどコーディングを終了しました。私はこれを助けてくれたMatt Weberの[post](http://badecho.com/2011/11/validating-method-parameters-with-postsharp)を見つけました(最初の部分)。 検証コードを属性に入れることについて、私はインターフェイスメソッド 'GetValidator'を追加したので、各属性は適切なバリデータを返します。 私が直面している問題は、RangeValidatorのような汎用バリデータです。なぜなら、C#は一般的な属性をサポートしていないため、int、double、datetimeなどのあらゆるタイプのコンストラクタをオーバーロードする必要があります... – Ashkan

+1

あなたの答えは私にこのアプローチについて気分を良くしました。 また、FluentValidationでバリデーターを書いています。私はそれがかなり良いと思う。 – Ashkan

関連する問題