1

サービスコントローラーとしてインターフェイスを実装しようとしています。私はこのインターフェースを維持していないので、変更することはできません。私のコントローラの場合次の文字列入力がオプションではない場合、オプションの文字列入力?

public interface IFoo 
{ 
    string Bar(string A, int B); 
} 

、のは、それは次のようになりましょう:この設定で

public class FooController : ApiController, IFoo 
{ 
    [Route("~/Foo/Bar")] 
    [HttpGet] 
    public string Bar(string optionalA, int requiredB) 
    { 
     return DoStuff(optionalA, requiredB); 
    } 
} 

、どのように私はオプションとしてABなどを飾ることができます簡単にするために、インターフェースは次のようになりますのは、言わせてIFooを変更せずに(つまり、AとBを並べ替えることはできません)、コントローラーにIFooを実装している間は必要ですか?既定では、すべての文字列パラメータは、私がRequiredAttributeでそれらを飾らない限り、オプションにデフォルトに戻すクラスにそれらを引っ張らない限り必須ですが、それはIFooの変更を必要とするか、このコントローラクラスでIFooを実装します。

Swagger & Swagger UIがそれを賞賛する方法でこれを行うためのまっすぐな方法がありますか?私が持っている

public string Bar(int requiredB, string optionalA = null) 
+1

ハッキーな解決策が必要です。あなたはこれも多かれ少なかれ同じことをすることができます 'public string FakeBar(int requiredB、string optionalA = null) { return bar(optionalA、requiredB); } ' – Nkosi

+0

JSなどのクライアントからWeb APIを呼び出すときには、引数の値を名前で設定します。右? Web APIメソッドの引数の順序が重要なのはなぜですか?あなたのAPIの呼び出し側に影響を与えずに、C#requireのようなオプションのパラメータを最後に置くことができるはずです –

+0

@GlennFerrieもし私がそうするなら、私はもはやこのコントローラクラスでIFooを実装していません。 – Jaxidian

答えて

0

:私はAとB(それはオプションではありません)その後、簡単な解決策はこれですの順序を変更することができればということを理解しない

public class FooController : ApiController, IFoo 
{ 
    [Route("~/Foo/Bar")] 
    [HttpGet] 
    public string FakeBar(MyDto data) 
    { 
     return Bar(data.optionalA, data.requiredB); 
    } 

    [ApiExplorerSettings(IgnoreApi = true)] 
    public string Bar(string optionalA, int requiredB) 
    { 
     return DoStuff(optionalA, requiredB); 
    } 
} 

public class MyDto 
{ 
    // defaults to optional here 
    public string optionalA { get; set; } 

    [Required] 
    public int requiredB { get; set; } 
} 

:私はこのハックソリューションを避けるしたいのですが私はこれを達成することができないことを発見した。私はどちらかのインタフェースを変更するか、インタフェースを実装しないか、あまりにも多くの追加コードを引き起こす何らかの厄介なことを余儀なくされます。現時点では、アクションハンドラへのパラメータの必要性を直接制御する他の方法はないと思います。

私を訂正する人には喜んでお待ちしています! ;-)

関連する問題