继@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));
}
这使我能够删除验证 Query 和 Form 值的仪式代码(当我记得这样做时,并不是每次都这样做)。所以你会得到更简洁的代码,更容易阅读,更容易记住首先进行检查,例如:
前
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
};