Ich erstelle eine einfache Guard-API, um zu verhindern, dass illegale Parameter an Funktionen übergeben werden und so weiter.So erstellen Sie eine Fluent Nested Guard-API
Ich habe den folgenden Code:
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;
}
Im Moment kann der Code in ähnlicher Weise verwendet wird (beachten Sie, das nur ein dummes Beispiel ist):
void DummyMethod(int? someObject) {
Guard.Ensure(someObject, "someObject")
.IsNotNull()
.IsGreaterThan(0)
.IsLessThan(10);
}
Dies alles funktioniert fein. Was ich möchte jetzt tun können ist die API erweitern, um Kind Eigenschaften bei den Kontrollen in der folgenden Art und Weise beinhaltet:
Guard.Ensure(someObject, "someObject")
.IsNotNull()
.Property(
(x => x.ChildProp1, "childProp1")
.IsNotNull()
.IsGreaterThan(10)
)
.Property(
(x => x.ChildProp2, "childProp2")
.IsNotNull()
.IsLessThan(10)
);
Offensichtlich ist die neue .Property
Methode, um die Mutter GuardArgument
um Kette zurückkehren muss. Außerdem muss die untergeordnete Eigenschaft in der Lage sein, die vorhandenen Prüfmethoden (IsNotNull()
usw.) zu verwenden, um eine Code-Duplizierung zu vermeiden.
Ich kann nicht herausfinden, wie die Lambda/Eigenschaft Funktion Parameter zu bauen oder wo die .Property
Methode sollte gefunden werden - dh sollte es eine Eigenschaft auf der GuardArgument
oder woanders sein, oder auch wenn es eine bessere Struktur der API ist .
Könnte ein Tippfehler sein, aber der GuardArgument Konstruktor setzt 'Name = Name' –
Sie sagen:„Offensichtlich ist die neue '.Property' Methode muss das übergeordnete' GuardArgument', um zurückzukehren ketten. " - Nein. Das ist nicht korrekt. Wenn Sie versuchen, eine fließende API zu erstellen, sollten Sie die Eltern nicht übergeben - Sie sollten ein neues 'GuardArgument' konstruieren, das die Eltern verschachtelt, ansonsten können Sie schreckliche Fehler erzeugen, indem Sie Referenzen entlang der Kette beibehalten und dann versuchen, neue Ketten zu erstellen von ihnen. – Enigmativity