我试图传递一个接口参数作为我创建的POST和PUT api的请求对象的一部分,但我不确定如何添加JSON反序列化器以能够指定用于哪个服务的具体类。我如何指定我想使用FooRequestData为一个和FooOtherRequestData为另一个?
[ApiController]
[Route("api/[controller]")]
public class FooController
{
// POST api/<APIController>
[HttpPost]
public FooResponse Post(FooRequest request)
{
return FooService.Post(request);
}
// PUT api/<APIController>
[HttpPut]
public FooResponse Put(FooRequest request)
{
return FooService.Put(request);
}
}
public class FooRequest : IRequest<Foo>
{
public IRequestData RequestData { get; set; }
}
public class FooRequestData : IRequestData
{
public string Boo { get; set; }
}
public class FooOtherRequestData : IRequestData
{
public string Hoo { get; set; }
}
我认为这个问题的答案可能对你有用:创建一个结果过滤器并将其添加到你想要指定行为的控制器。
最初我认为TextOutputFormatter会工作,但似乎没有一种方法来检查输出格式化请求的控制器或服务。
我明白你想做什么,但是,它不会工作。问题不在于API,而在于接口如何被序列化/反序列化并转换为它们的继承类。
例如,如果IRequestData
最初是FooRequestData
,但你现在决定将其转换为FooOtherRequestData
,它将抛出一个错误,因为你不能将IRequestData
转换为FooOtherRequestData
,如果它不是FooOtherRequestData
开始。
相反,我建议以下两件事之一:
选项1:继续使用接口
一个接口并不会像转换成父类那样移除属性。属性仍然在那里,只是不可访问。但是当你把它作为json对象返回时,它仍然会显示所有的属性。
虽然这是在类之间传递,但我相当确定它也扩展到API请求。
当你想使用它们作为输入时,只需将接口作为需求传递下去。
选项2:添加特定的转换
在代码中工作时,您可以添加检查以查看是否可以显式转换:
if(request.RequestData.GetType().IsAssignableTo(typeof(FooRequestData))) {
var reqData = (FooRequestData)request.RequestData;
...
}
if(request.RequestData.GetType().IsAssignableTo(typeof(FooOtherRequestData))) {
var reqData = (FooOtherRequestData)request.RequestData;
...
}