代码之家  ›  专栏  ›  技术社区  ›  Jaxidian

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

  •  1
  • Jaxidian  · 技术社区  · 8 年前

    我试图将接口实现为服务控制器。我不维护此接口,因此无法修改它。为了简单起见,我们假设界面如下所示:

    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 但我不能在这里这样做,因为这需要改变 伊福 或者会违反我的实现要求 伊福 使用这个控制器类。

    有没有一种直截了当的方式来做到这一点;大摇大摆的用户界面尊重它?我想避免这种黑客解决方案:

    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 回复  |  直到 8 年前
        1
  •  0
  •   Jaxidian    7 年前

    我发现我无法做到这一点。我被迫要么改变接口,要么不实现接口,或者其他一些令人讨厌的事情,导致太多额外的代码。此时,我认为没有其他方法可以直接控制动作处理程序对参数的要求。

    我很乐意听从任何纠正我的人