当以下字符串输入不是可选时,可选字符串输入?

Optional string input when following string inputs are not optional?

我正在尝试将接口实现为服务控制器。我不维护这个接口,所以我无法修改它。为简单起见,假设界面如下所示:

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

使用此设置,如何在不更改 IFoo(即无法重新排序 A 和 B)的情况下将 A 装饰为可选,将 B 装饰为必需,同时仍然让我的控制器实现是不是?默认情况下,所有字符串参数都被认为是必需的,除非我将它们拉入 class ,此时它们恢复默认为 Optional 除非我用 RequiredAttribute 装饰它们,但我不能在这里这样做,因为那需要要么更改 IFoo,要么会破坏我使用此控制器 class.

实现 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)

我发现我无法做到这一点。我被迫更改接口或不实现接口或其他一些导致过多额外代码的讨厌的事情。目前,我认为没有其他方法可以直接控制操作处理程序参数的必要性。

我很乐意听从任何纠正我的人! ;-)