2013-05-06 77 views
1

我有一個ApiController看起來像這樣的方法:Asp.Net Web Api - 不綁定/格式化參數的屬性?

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

是的,我知道這是不好的設計,但我在不同的迭代解決這個問題。我想我可以簡單地重用控制器(爲什麼不,我可以從我的IoC容器中取出它)。唯一的問題是,在這種情況下,我需要注入的IServiceClass我自己的實現,很容易:通過一個普通的API調用Optionalparameter 'serviceClass' is not supported by FormatterParameterBinding調用這個時候

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

除了現在我得到的錯誤。

我知道有各種控制綁定的屬性。是否有一個我可以放在參數說,它不應該綁定。

+0

你可以移動'serviceClass'到控制器的範圍,而不是操作方法你現在擁有它的範圍? – 2013-05-06 02:06:06

+0

IoC通常在對象構造時發生,因此IServiceClass參數需要是一個構造函數參數(即您複製到私有實例字段並從中使用)而不是方法參數。也就是說,他說了什麼。 – ChrisF 2013-05-06 03:08:04

+0

這意味着ServiceClass會初始化任何控制器方法調用。在更好的體系結構中,這不會是一個問題,但是這是一個已經實現的原型,而路由和控制器重構等事情則是另一次迭代。 @ChrisF - 你是對的,它的這一部分只是常規的DI,而不是IoC,我只是通過參數注入依賴。我也可以通過一個屬性獲得類似的結果,但我正在尋找屬性。 – 2013-05-06 14:19:46

回答

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) 
+0

謝謝,我最終只是把'Lazy <>'並在這種情況下使用屬性注入,但謝謝你告訴我如何做到這一點。 – 2013-05-06 19:59:13