@TheCodeJunkieの回答に続いて、リクエストが有効であることを確認するために値をNancyContext
事前にチェックするルート条件を提供するようにを拡張するという彼のアイデアに少し興奮しました。Query
私はさらに、値、コレクション、さらにはコレクションNancyContext
に対して同じ事前チェックを提供するように拡張しました。Form
Header
Files
public static bool HasQuery(this NancyContext context, params string[] values)
{
var query = context.Request.Query;
return values.All(value => query[value].HasValue);
}
public static bool HasForm(this NancyContext context, params string[] values)
{
var form = context.Request.Form;
return values.All(value => form[value].HasValue);
}
public static bool HasHeader(this NancyContext context, params string[] values)
{
var headers = context.Request.Headers;
return values.All(value => !headers[value].FirstOrDefault().IsEmpty());
}
public static bool HasFile(this NancyContext context, params string[] values)
{
var files = context.Request.Files;
return values.All(value => files.Any(file => file.Key == value));
}
これにより、クエリとフォームの値を検証していた儀式用のコードを削除することができました(これを覚えていたとき、それは毎回ではありませんでした)。したがって、最初にチェックを行うことを覚えやすく、読みやすく、覚えやすい、よりクリーンなコードを取得できます。次に例を示します。
前
Post["/"]=_=>
{
var form = Request.Form;
if (
!form.username.HasValue ||
!form.password.HasValue ||
!form.email.HasValue ||
!form.claim.HasValue)
{
return HttpStatusCode.UnprocessableEntity;
}
//process form values with confidence
}
後
Post["/", ctx => ctx.HasForm("username", "password", "email", "claim")]=_=>
{
//process form values with confidence
};