查看ASP.NET Web Api,您可以向方法参数添加[FromBody]
和[FromUri]
等属性,例如:
public virtual Foo Get([FromUri] Guid id)
public virtual HttpResponseMessage Post([FromBody] Foo foo)
我也知道它们在CallerInformation
中使用。
我理解他们在这种情况下正在做什么,但我有兴趣了解导致其使用的设计选择。
还有,
方法参数上使用的属性的更多示例。
答案 0 :(得分:2)
当ASP.NET调用这些方法时,需要确定哪个值到哪个参数。对于每个参数,它使用反射来检查这些属性,这些属性指定参数值的来源,为您提供控制。这就是他们如何做到这一点:
Type myType = typeof(MyType)
MethodInfo method = myType.GetMethod('Post');
foreach (ParameterInfo parameter in method.GetParameters())
{
if (parameter.IsDefined(typeof(FromUri), false))
{
// attempt to find value in uri
}
else if (parameter.IsDefined(typeof(FromPost), false))
{
// from post body
}
else
{
// have to find out myself!
}
}
我认为任何替代方案都不如此简单灵活 - 您当然可以使用单独的配置文件或实现描述参数值来源的界面 - 我认为它很不错把它全部定义在那个方法上。
此外,通过将请求主体作为参数传递给方法,您可以在没有Web环境的情况下对方法进行单元测试。