Sto costruendo una semplice API Guard per proteggere da parametri illegali passati a funzioni e così via.Come creare un'API Fluent Nested Guard
Ho il seguente codice:
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;
}
Al momento il codice può essere utilizzato in modo simile a (notare che questo è solo un esempio muto):
void DummyMethod(int? someObject) {
Guard.Ensure(someObject, "someObject")
.IsNotNull()
.IsGreaterThan(0)
.IsLessThan(10);
}
Questa tutte le opere bene. Quello che voglio essere in grado di fare ora è estendere l'API per includere proprietà secondarie nei controlli nel modo seguente:
Guard.Ensure(someObject, "someObject")
.IsNotNull()
.Property(
(x => x.ChildProp1, "childProp1")
.IsNotNull()
.IsGreaterThan(10)
)
.Property(
(x => x.ChildProp2, "childProp2")
.IsNotNull()
.IsLessThan(10)
);
Ovviamente il nuovo metodo .Property
deve restituire il genitore GuardArgument
al fine di catena. Inoltre, la proprietà del bambino deve essere in grado di utilizzare i metodi di controllo esistenti (IsNotNull()
ecc.) Per evitare la duplicazione del codice.
Non riesco a capire come costruire i parametri della funzione lambda/Property o dove deve essere posizionato il metodo .Property
- cioè dovrebbe essere una proprietà su GuardArgument
o da qualche altra parte, o anche se c'è una struttura migliore per l'API .
potrebbe essere un errore di battitura, ma il costruttore GuardArgument imposta 'Name = Name' –
Tu dici: "Ovviamente il nuovo metodo '.Property' deve restituire il genitore' GuardArgument' al fine per catena. " - No. Non è corretto. Se stai provando a fare un'API fluente, non dovresti passare il genitore - dovresti costruire un nuovo 'GuardArgument' che nidifica il genitore altrimenti puoi creare bug terribili conservando i riferimenti lungo la catena e poi provando a costruire nuove catene da loro. – Enigmativity