5

先日、まったく違うものを探していたときに、.NETでFluentValidationを実行するための2つのライブラリに出くわしました。これまでのところ、通常の条件付きステートメントと分岐ステートメント(if、else、caseなど)を使用して検証を行っているため、この概念は興味深いようです。

特に、複雑な条件のコードが短くなる可能性のあるいくつかの条件をチェーンし、同じオブジェクトに違反ごとにいくつかのエラーメッセージを埋め込むことが比較的簡単になります。

そうは言っても、コードが通常のC#よりも冗長に見えるのではなく、T-SQLに少し似ている場合もあります...これにより、コードのルックアンドフィールに一貫性がなくなりませんか?

つまり、Fluent Validationについてどう思いますか。気に入った場合は、どのライブラリが最適だと思いますか。これまでのところ、私はhttp://tnvalidate.codeplex.com/http://fluentvalidation.codeplex.com/を見てきましたが、これらは一見するとほぼ同等に見えます...

ありがとう。

4

3 に答える 3

4

http://rulesengine.codeplex.com/もあります。 これは、fluent-interfaceヘルパークラスを使用してエンジンにルールを追加します(これは、オブジェクトの検証に使用されます)。

コンポジション、クロスフィールド、条件付き、多言語などをサポートします。

于 2011-09-26T09:26:12.650 に答える
2

私は自分で似たようなものに出くわし、コードが冗長にならないように正確に記述しました。

私は次のようなことを行う独自の検証を行っています。

Validation.IsNullOrEmpty(m => m.FirstName, modelState);
Validation.Validate(m => m.ZipCode, z => z.Length == 5, modelState, 
"ZipCode must be 5 characters long");

現在、これは私が使用しているMVCアーキテクチャと非常に密接に関連していますが、以下よりも読みやすく、保守しやすいことがわかりました。

if (string.IsNullOrEmpty(FirstName))
{
  ModelState.AddError("FirstName", "FirstName cannot be empty.");
}

このコンテキストでは、それほど目立ちませんが、検証を行う場合、検証するアイテムを多数持つことができるため、1つのライナーをスキャンして、検証が何を行っているかを把握するのがはるかに簡単になります。

私がそこに置いた最初のコードに出くわしたのは初めてで、何が起こっているのかを理解する必要がありますが、それを乗り越えると、複数のブロックよりも1つのライナーの束の方が目に優しいと思います2番目の方法で生成されます。

于 2010-07-11T13:35:05.260 に答える
2

ここで公開した独自の検証ライブラリを使用しています。

提案した2つとの違いは、検証が別々の検証クラスに入れられることです。検証クラスを作成して忘れることができます。検証クラスは検証ライブラリによって自動的に検出されます。

public class MyModelValidator : FluentValidator<MyModel>
{
  public MyModelValidator()
  {
    Property("FirstName").Required();
    Property("LastName").Required().Min(15);
  }
}

非常にお気に入りのローカリゼーションライブラリ(文字列テーブルなど)を使用して、ローカリゼーションのサポートを追加するのも簡単です。

public class StringTableProvider : ILanguagePrompts
{
    public string this[string modelName, string propertyName]
    {
        get { return Get(modelName, propertyName) ?? "[" + propertyName+ "]"; }
    }

    public string Get(string modelName, string propertyName)
    {
        return Resource1.ResourceManager.GetString(modelName + "_" + propertyName);
    }
}

そして構成するには:

Validator.LanguageHandler = new StringTableProvider();

実際の検証は次のように行われます。

User user = new User();
user.FirstName = "Jonas";

var errors = Validator.Validate(user);
if (errors.Count > 0)
{
    // Handle the errors in any way you like.
    // both property names (localized and actual property name) and localized error message is accessible.
}
于 2010-07-11T13:35:45.213 に答える