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

С помощью этой установки, как я могу украсить A в качестве факультативных и B как Требуется без изменения IFoo (т. Е. Не может изменить порядок A и B), и при сохранении моего контроллера IFoo? По умолчанию все строковые параметры считаются обязательными, если я не вытаскиваю их в класс, в этот момент они возвращаются к умолчанию по умолчанию, если я не украшаю их RequiredAttribute, но я не могу сделать это здесь, потому что это потребует либо изменения IFoo, либо нарушит мое требование для реализации IFoo с этим классом контроллера.

Есть ли прямой способ сделать это так, чтобы Swagger & Пользовательский интерфейс Swagger отличием? Я хотел бы избежать этого Hacky решение:

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

Я понимаю, что если бы я мог изменить порядок А и В (это не вариант), то простое решение заключается в следующем:

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

Решение Hacky должно работать. вы также можете сделать это, что более или менее одно и то же »public string FakeBar (int requiredB, string optionalA = null) { return Bar (optionalA, requiredB); } ' – Nkosi

+0

, когда вы вызываете веб-API от JS или какого-либо другого клиента, вы устанавливаете значения для аргумента по имени. правильно? так почему смысл аргументов в методе веб-API значителен? Вы должны иметь возможность поставить свои дополнительные параметры в конце, как это требует C#, не оказывая влияния на вызывающего пользователя вашего API. –

+0

@GlennFerrie. Если я это сделаю, то я больше не буду реализовывать IFoo с этим классом Controller. – Jaxidian

ответ

0

У меня есть что я не могу этого сделать. Я вынужден либо изменить интерфейс, либо не реализовывать интерфейс или какую-либо другую неприятную вещь, которая вызывает слишком много дополнительного кода. В настоящее время, я думаю, нет другого способа напрямую контролировать необходимость параметра в обработчике действий.

С радостью отнеситесь ко всем, кто меня исправляет! ;-)