Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对于从RESTAPI控制器反序列化基类,是否有一个通用的解决方案?_C#_.net_Rest - Fatal编程技术网

C# 对于从RESTAPI控制器反序列化基类,是否有一个通用的解决方案?

C# 对于从RESTAPI控制器反序列化基类,是否有一个通用的解决方案?,c#,.net,rest,C#,.net,Rest,基本上有两件事对我很重要。 第一个问题的答案与我的答案相同()。RESTful设计在实现时更易于维护,如: GET /animals # get all animals POST /animals # create a dog or cat GET /animals/123 # get animal 123 而不是: GET /dogs # get all dogs POST /dogs # create a dog GET /dogs/1

基本上有两件事对我很重要。 第一个问题的答案与我的答案相同()。RESTful设计在实现时更易于维护,如:

GET /animals        # get all animals
POST /animals       # create a dog or cat
GET /animals/123    # get animal 123
而不是:

GET /dogs       # get all dogs
POST /dogs      # create a dog
GET /dogs/123   # get dog 123

GET /cats       # get all cats
POST /cats      # create a cat
GET /cats/123   # get cat 123
我不知道如何设置将以下代码反序列化为例如dog类型的对象的正确方法。我往往会感到困惑,因为大多数人建议只创建一个/animals POST端点,而不是/animals/dog POST,但没有提供直接的解决方案

我找到的解决方案有:

  • TypeNameHandling.Auto(除非自定义序列化程序,否则不安全?)

  • 自定义JsonConverter,就我而言,它还需要一个自定义实现来告诉派生类中有哪些字段

  • JsonSubTypes(typeof(…))注释。这还需要在自定义映射中包含来自派生类的字段

最后,我想实现以下目标。如果这意味着这种“通用”解决方案最终不值得,那对我来说也是一个答案

 [HttpPost]
 public async Task<ActionResult> Add(Animal animal)
 {
     // repo.add(animal);
 }
[HttpPost]
公共异步任务添加(动物)
{
//补充回购(动物);
}

为什么不使用路由属性

所以你的路线看起来像

POST animals/dog
您只需执行以下操作:

[HttpPost]
[Route("dog")]
public Task<IActionResult> AddDog(Dog dog)
通过这种方式,它的所有内容都包含在一个控制器中,并且URI都来自于一个控制器


由于事情的连载方式,我不认为有一种方法可以让你只发布一个通用的动物,它知道去狗或猫。你需要为它编写一个自定义的反序列化程序,显示你的类,也就是你的代码,对象本身能够处理它,这取决于你的代码是什么样子,class->BaseAnimal->property bool HasFur。序列化版本看起来就像是在一个类中,不知道任何基类,然后可以反序列化到特定的动物,必须反序列化到动物,然后可以在运行时询问动物的类型,然后转换到该类型。因此,您可能需要反序列化两次,一次获取动物类型,然后反序列化到该动物。但问题是直接从控制器执行此操作。我使用了典型的“animal”基类和“dog”、“cat”派生类示例。对我来说,这与派生类的属性无关。我想我明白你的意思,但从我所看到的来看,你引用的链接中的答案是最好的。。您需要将api调用拆分为它们正在执行的方式。。。动物的叫声,暴露了你可以叫出的叫声。。。就像他们在你的链接中所做的一样,答案就是证明这一点。是的,我也找不到另一种方法来做,但我对人们通常做什么感兴趣。因此,似乎会有(很多)衍生资源。感谢您的输入:)标记我同意,如果有更多的方法来实现这一点,那将是很有趣的。我跟随的文章建议只制作一个端点,该端点可以发布“任何”动物。前端实际上是发送一只带有相应属性的狗。我的问题是认识到这一点,这样我就可以使用POST-animes/。啊,我现在明白你的意思了!对不起,伙计!我要做的是将一个属性放入基类中,比如Type或其他什么,当基类被反序列化时,您可以在controller方法中检查该类型属性,即Dog或Cat。从那里你可以得到请求流,然后重新反序列化到正确的抽象中。我已经害怕了。您的建议可能是一个很好的解决方案,但我希望有更简单或更可读的内容。谢谢你的意见。我将把你的答案标记为已解决,因为我认为这是最终解决问题的更好方法。即使它会产生更多的端点,为什么不检查GraphQL呢?它提供了一个单一的终点,并在幕后进行检查,以确定数据应该从何处处理/获取,以及以何种方式处理/获取?
localhost:PORT/animals/dog