関数に渡される不正なパラメータなどから保護するための簡単なGuard APIを構築しています。Fluent Nested Guard APIを構築するには
void DummyMethod(int? someObject) {
Guard.Ensure(someObject, "someObject")
.IsNotNull()
.IsGreaterThan(0)
.IsLessThan(10);
}
このすべての作品:コードは(これは単なるダム一例であることに注意)と同様に使用することができます現時点では
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;
}
:
私は、次のコードを持っています良い。私は今、行うことができるようにしたいことは、次のようにチェックで子プロパティを含めるように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の構造がさらに改善されていても。
はタイプミスかもしれませんが、GuardArgumentコンストラクタはあなたが明らかに新しい '.Property'方法を順に親' GuardArgument'を返す必要がある」、と言う '名= NAME' –
設定しますチェーンに。 - いいえ、それは間違っています。あなたが流暢なAPIを作ろうとしているなら、親を渡すべきではありません。親を入れ子にする新しい 'GuardArgument'を構築しなければなりません。そうでなければ、鎖に沿って参照を保持し、それらから。 – Enigmativity