Fluent Nested GuardAPIを構築する方法

グラハム

不正なパラメーターが関数などに渡されるのを防ぐために、単純なGuardAPIを構築しています。

私は次のコードを持っています:

public static class Guard
{
    public static GuardArgument<T> Ensure<T>(T value, string argumentName)
    {
        return new GuardArgument<T>(value, argumentName);
    }
}

public class GuardArgument<T>
{
    public GuardArgument(T value, string argumentName)
    {
        Value = value;
        Name = Name;
    }

    public T Value { get; private set; }
    public string Name { get; private set; }
}

// Example extension for validity checks
public static GuardArgument<T> IsNotNull<T>(this GuardArgument<T> guardArgument, string errorMessage)
{
    if (guardArgument.Value == null)
    {
        throw new ArgumentNullException(guardArgument.Name, errorMessage);
    }

    return guardArgument;
}     

現時点では、コードは次のように使用できます(これは単なるばかげた例であることに注意してください)。

void DummyMethod(int? someObject) {

    Guard.Ensure(someObject, "someObject")
       .IsNotNull()
       .IsGreaterThan(0)
       .IsLessThan(10);
}

これはすべて正常に機能します。私が今できるようにしたいのは、次の方法でチェックに子プロパティを含めるようにAPIを拡張することです。

Guard.Ensure(someObject, "someObject")
    .IsNotNull()
    .Property(
        (x => x.ChildProp1, "childProp1")
           .IsNotNull()
           .IsGreaterThan(10)
     )
     .Property(
        (x => x.ChildProp2, "childProp2")
           .IsNotNull()
           .IsLessThan(10)
     );

明らかに、新しい.PropertyメソッドはGuardArgumentチェーンするために親を返す必要がありますさらに、子プロパティは、IsNotNull()コードの重複を避けるために、既存のチェックメソッド(など)を使用できる必要があります

ラムダ/プロパティ関数パラメーターを作成する.Property方法や、メソッドを配置する場所を理解できません。つまり、それがGuardArgumentまたは他の場所のプロパティであるか、APIの構造が優れている場合でもです。

Seaal

次の関数を使用すると、必要な構文と同様の構文を使用できます。

public static GuardArgument<T> Property<T, TProp>(this GuardArgument<T> guardArgument, Func<T, TProp> getProperty, string propertyName, Action<GuardArgument<TProp>> validate)
{
    GuardArgument<TProp> propertyGuardArgument = new GuardArgument<TProp>(getProperty(guardArgument.Value), propertyName);

    validate(propertyGuardArgument);

    return guardArgument;
}

この関数は、選択したプロパティの新しいGuardArgumentを作成し、これをActionパラメーターに渡して、必要に応じて検証できるようにします。

これにより、プロパティを無限に連鎖させることもできますが、特に読みやすいかどうかはわかりません。

使用法:

Guard.Ensure(someObject, "someObject")
     .IsNotNull()
     .Property(x => x.ChildProp1, "childProp1", childProp1 =>
         childProp1.IsNotNull()
                   .IsLessThan(10)
                   .Property(y => y.InnerChildProperty, "innerChildProperty", innerChildProperty =>
                       innerChildProperty.IsNotNull()
                    )
     )
     .Property(x => x.ChildProp2, "childProp2", childProp2 =>
         childProp2.IsNotNull()
                   .IsGreaterThan(10)
     );

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

外部キーを含む複合主キーを構成する方法(EF Fluent API)

分類Dev

fluent-schemaでarray()を返す方法は?

分類Dev

Fluent WaitでNoSuchElementExceptionを処理する

分類Dev

VaporとFluentでMongoDBを使用する

分類Dev

IntelliJでFluent APIのフラット化を停止する方法

分類Dev

EF Core Fluent API(主キーからIDを削除する方法)

分類Dev

node-fluent-ffmpegでstderrを取得する方法

分類Dev

Java Fluent API-より良い方法?

分類Dev

Fluent-bit-jsonログをElasticsearchの構造化フィールドに分割する

分類Dev

Whenを使用したMVCとFluent検証

分類Dev

IFormFileのFluent検証を実装する正しい方法は何ですか

分類Dev

Laravel Fluent / Eloquent-関連する行を確認します

分類Dev

Fluent構文を使用したネストされたGroupByLINQ

分類Dev

動的なFunc <>構造を備えたC#Fluent API

分類Dev

gtkparasiteを構築する方法

分類Dev

「友情」を構築する方法

分類Dev

Fluent Validation ASP.NETCoreを使用する場合のNullReferenceException

分類Dev

ビデオfluent-ffmpegに複数の画像を追加する

分類Dev

Fluent UIDetailsListで選択したアイテムを取得する

分類Dev

Fluent Assertions.ShouldBeEquivalentTo の DataMember を無視する

分類Dev

データマッパー-ルートにFluentマッパー構成を作成する

分類Dev

Fluent API-これを返すか、新しいですか?

分類Dev

VaporアプリケーションでFluentと結合する

分類Dev

Fluent + Vaporで子をクエリします

分類Dev

Fluent API:参照型は相互に値を取ります

分類Dev

Fluent NHibernateクエリ:null許容列値を確認します

分類Dev

Springbootでfluent-logger-javaをlogbackアペンダーと連携させる方法

分類Dev

Laravel Fluentを使用して、更新または挿入された行を取得する方法はありますか?

分類Dev

Fluentの移行を強制してドロップされたテーブルを再作成する-Vapor3 iOS SwiftMySQLでFluentを使用する

Related 関連記事

  1. 1

    外部キーを含む複合主キーを構成する方法(EF Fluent API)

  2. 2

    fluent-schemaでarray()を返す方法は?

  3. 3

    Fluent WaitでNoSuchElementExceptionを処理する

  4. 4

    VaporとFluentでMongoDBを使用する

  5. 5

    IntelliJでFluent APIのフラット化を停止する方法

  6. 6

    EF Core Fluent API(主キーからIDを削除する方法)

  7. 7

    node-fluent-ffmpegでstderrを取得する方法

  8. 8

    Java Fluent API-より良い方法?

  9. 9

    Fluent-bit-jsonログをElasticsearchの構造化フィールドに分割する

  10. 10

    Whenを使用したMVCとFluent検証

  11. 11

    IFormFileのFluent検証を実装する正しい方法は何ですか

  12. 12

    Laravel Fluent / Eloquent-関連する行を確認します

  13. 13

    Fluent構文を使用したネストされたGroupByLINQ

  14. 14

    動的なFunc <>構造を備えたC#Fluent API

  15. 15

    gtkparasiteを構築する方法

  16. 16

    「友情」を構築する方法

  17. 17

    Fluent Validation ASP.NETCoreを使用する場合のNullReferenceException

  18. 18

    ビデオfluent-ffmpegに複数の画像を追加する

  19. 19

    Fluent UIDetailsListで選択したアイテムを取得する

  20. 20

    Fluent Assertions.ShouldBeEquivalentTo の DataMember を無視する

  21. 21

    データマッパー-ルートにFluentマッパー構成を作成する

  22. 22

    Fluent API-これを返すか、新しいですか?

  23. 23

    VaporアプリケーションでFluentと結合する

  24. 24

    Fluent + Vaporで子をクエリします

  25. 25

    Fluent API:参照型は相互に値を取ります

  26. 26

    Fluent NHibernateクエリ:null許容列値を確認します

  27. 27

    Springbootでfluent-logger-javaをlogbackアペンダーと連携させる方法

  28. 28

    Laravel Fluentを使用して、更新または挿入された行を取得する方法はありますか?

  29. 29

    Fluentの移行を強制してドロップされたテーブルを再作成する-Vapor3 iOS SwiftMySQLでFluentを使用する

ホットタグ

アーカイブ