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); 
    } 
} 

, 어떻게 선택하고 B 등으로 A을 장식 할 수 단순화를 들어, 인터페이스는 다음과 같습니다 가정 해 봅시다 IFoo을 변경하지 않고 (즉, A와 B를 재정렬 할 수 없음), 컨트롤러에 IFoo를 구현하는 동안 필요합니까? 기본적으로 모든 문자열 매개 변수는 필요하다고 간주됩니다. 어떤 클래스에서 어떤 옵션을 기본값으로 되돌리려면 RequiredAttribute으로 꾸며야합니다. 그러나 IFoo을 변경하거나 내 요구 사항을 위반하게되므로 여기서는 수행 할 수 없습니다. 이 컨트롤러 클래스를 사용하여 IFoo을 구현하십시오.

Swagger & Swagger UI가이를 존중하는 방식으로이를 수행 할 수있는 방법이 있습니까? 나는이 해키 솔루션을 피하기 위해 싶습니다

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; } 
} 

이해 할을하는 나는 순서를 변경 할 수 있다면 A와 B (즉 옵션이 아니다) 후 간단한 해결책이있다 :

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

해키 솔루션이 작동해야합니다. 당신은 또한 이것을 어느 정도 할 수있다.'public string FakeBar (int requiredB, string optionalA = null) { return bar (optionalA, requiredB); }' – Nkosi

+0

JS 또는 다른 클라이언트에서 웹 API를 호출 할 때 이름의 인수 값을 설정합니다. 권리? 그렇다면 웹 API 방법의 논쟁 순서가 중요한 이유는 무엇입니까? API 호출자에게 영향을 미치지 않고 C# require와 같은 끝에 선택적 매개 변수를 넣을 수 있어야합니다. –

+0

@GlennFerrie 이렇게하면이 Controller 클래스로 IFoo를 구현할 필요가 없습니다. – Jaxidian

답변

0

내가 가진 나는 이것을 성취 할 수 없다는 것을 발견했다. 나는 인터페이스를 변경하거나 너무 많은 추가 코드를 유발하는 인터페이스 나 다른 불쾌한 것을 구현하지 않을 것을 강요 당한다. 지금은 액션 핸들러에 매개 변수의 필요성을 직접 제어 할 수있는 다른 방법이 없다고 생각합니다.

나를 교정하는 사람에게 기꺼이 맡길 것입니다! ;-)