Я понимаю, что, поскольку мы используем Minimal API, у нас нет другого выбора, кроме как использовать System.Text. Json, и это вызывает некоторые проблемы с полиморфизмом, в результате чего либо отсутствуют типы объектов в возвращаемом JSON, либо при попытке использовать [JsonDerivedType(...)] возникает ошибка во время выполнения:
System.ArgumentException: элемент с таким же ключом уже добавлен. Ключ: [keyname...]
У меня такое ощущение, что это вызвано степенью наследования. Я не могу опубликовать здесь фактический код, но ниже резюмируется проблема, с которой я столкнулся (описание ниже) - в решении все интерфейсы и классы представляют собой отдельные файлы, но для краткости я перечислил их в одном блоке здесь. :
Код: Выделить всё
public interface IContainer: IObject {
List Children {get;set;}
}
public interface IObject {
int Id {get;set;} //Lots of other parameters
}
public class ObjectType1 : DisplayBaseClass, IChild { //class }
public class ObjectType2 : DisplayBaseClass, IContainer { //class }
public class ObjectType3 : SomeOtherClass, IChild, IAnotherInterface, IAndAnother { //class }
Код: Выделить всё
IObject
Первое, что я попробовал:
Код: Выделить всё
[JsonDerivedType(typeof(ObjectType1), "[type discriminator here...]")]
[JsonDerivedType(typeof(ObjectType2), "[type discriminator here...]")]
[JsonDerivedType(typeof(ObjectType3), "[type discriminator here...]")]
public interface IObject {...
Я добился прогресса, разделив атрибуты [JsonDerivedType] на отдельные определения интерфейса:
Код: Выделить всё
//in IContainer.cs
[JsonPolymorphic(UnknownDerivedTypeHandling = JsonUnknownDerivedTypeHandling.FallBackToBaseType)]
[JsonDerivedType(typeof(ObjectType2), "[type discriminator here...]")]
public interface IContainer {...
//In IChild.cs
[JsonDerivedType(typeof(ObjectType1), "[type discriminator here...]")]
public interface IChild{...
Проблема в том, что я не могу понять, как добавить производный тип для ObjectType3. - если я добавлю [JsonDerivedType(nameof(ObjectType3), "...")] в IObject.cs, у меня снова появятся повторяющиеся ключи, и я не смогу использовать Swagger .
Кто-нибудь может объяснить, что Я делаю неправильно, особенно в отношении того, как добавлять производные типы без создания дубликатов ключей?
Подробнее здесь: https://stackoverflow.com/questions/793 ... licate-key