我在ApiController上有一个方法,如下所示:
public IEnumerable<Items> GetSlideSets() {
IServiceClass serviceClass = new ServiceClass();
//...
是的,我知道这不是好设计,但我在不同的迭代中解决了这个问题。
在我的应用程序中的某个时刻,我需要从项目本身内部调用此功能,所以我想我可以简单地重用控制器(为什么不能,我可以从IoC容器中取出它)。唯一的问题是,在这种情况下,我需要注入我自己的IServiceClass
实现,这很简单:
public IEnumerable<Items> GetSlideSets(IServiceClass serviceClass = null) {
serviceClass = serviceClass ?? new ServiceClass();
//...
除非现在通过常规Api电话Optionalparameter 'serviceClass' is not supported by FormatterParameterBinding
拨打电话,否则我会收到错误。
我知道有各种控制绑定的属性。是否有一个我可以在参数上说它不应该绑定。
答案 0 :(得分:2)
就像其他人提到的那样,在构造函数中注入依赖项可能是个更好的主意。
但是如果你真的必须避免绑定一个动作参数,那么就没有内置属性,但你可以很容易地创建一个。这是它的样子:
public class DontBindAttribute : ParameterBindingAttribute
{
public override HttpParameterBinding GetBinding(HttpParameterDescriptor parameter)
{
return new DontBindParameterBinding(parameter);
}
private class DontBindParameterBinding : HttpParameterBinding
{
public DontBindParameterBinding(HttpParameterDescriptor parameter) : base(parameter)
{
}
public override Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken)
{
actionContext.ActionArguments.Add(Descriptor.ParameterName, Descriptor.DefaultValue);
var completedTaskSource = new TaskCompletionSource<object>();
completedTaskSource.SetResult(null);
return completedTaskSource.Task;
}
}
}
您只需要在之后将该属性应用于参数:
public IEnumerable<Items> GetSlideSets([DontBind] IServiceClass serviceClass = null)