1

我在 ApiController 上有一个方法,如下所示:

public IEnumerable<Items> GetSlideSets() {
        IServiceClass serviceClass = new ServiceClass();
        //...

是的,我知道这不是好的设计,但我正在另一个迭代中解决这个问题。

在我的应用程序的某个时刻,我需要从项目本身中调用此功能,因此我认为我可以简单地重用控制器(为什么不可以,我可以将它从我的 IoC 容器中取出)。唯一的问题是,在这种情况下,我需要注入自己的 实现IServiceClass,这很简单:

public IEnumerable<Items> GetSlideSets(IServiceClass serviceClass = null) {
        serviceClass = serviceClass ?? new ServiceClass();
        //...

除了现在我通过常规 Api call 调用它时遇到错误Optionalparameter 'serviceClass' is not supported by FormatterParameterBinding

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

4

1 回答 1

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)
于 2013-05-06T19:13:53.973 回答