Asp.Net Web Api - 不绑定/格式化参数的属性?

时间:2013-05-06 01:42:19

标签: asp.net asp.net-web-api model-binding

我在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拨打电话,否则我会收到错误。

我知道有各种控制绑定的属性。是否有一个我可以在参数上说它不应该绑定。

1 个答案:

答案 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)