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