swagger 从另一个类中排除类属性的特定属性以避免循环引用

0qx6xfy6  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(247)

我在某些端点上的Swashbuckle Swagger UI出现冻结问题。这似乎是循环引用的问题。经过一些研究后,我仍然无法找到修复方法。
我发现这个问题,这是类似于我的问题,虽然我的是不是崩溃,只是冻结-Swagger crashes with circular model references
举例说明:

public class ObjectA
{
    public Guid Id { get; set; }

    // ...some other properties, up to 100 columns in some cases
    public virtual List<ObjectB> Foo { get; set; }

}

public class ObjectB
{
    public Guid Id { get; set; }
    public Guid RefId { get; set; }
    // ...some other properties, up to 100 columns in some cases
    public virtual ObjectA RefObj { get; set; }
}

删除上述任何一个类中的属性都不是一个选项,因为这是暴露所有链接实体所必需的。我也不想创建ObjectBsObjectA自定义类,它只包含没有循环引用的属性,因为这意味着我必须为ObjectB的每个循环引用创建一个。
我的想法是在序列化ObjectA时排除ObjectA.FooObjectA属性:

ObjectA {
 Id: 'objAId',
 //... other properties
 Foo: [
   {
     Id: 'someObjectBId',
     RefId: 'objAId',
     //... other properties of ObjectB
     RefObj: null
   }
 ]
}

我试着搜索,但是在网上什么都找不到。我也试过protectedprotected internal,但是这些完全排除了所有的属性,甚至在主类中。
可能是过滤器属性之类的东西,例如:

public class ObjectA
{
    public Guid Id { get; set; }

    // ...some other properties, up to 100 columns in some cases
    [DoNotInclude("RefObj")]
    public virtual List<ObjectB> Foo { get; set; }

}

public class ObjectB
{
    public Guid Id { get; set; }
    public Guid RefId { get; set; }
    // ...some other properties, up to 100 columns in some cases
    [DoNotInclude("Foo")]
    public virtual ObjectA RefObj { get; set; }
}
yacmzcpb

yacmzcpb1#

虽然您可以从序列化中排除具有相应属性的属性(JsonIgnoreAttribute对应于System.Text.Json,一个同名的属性对应于Newtonsoft Json.NET,请根据序列化使用的属性选择正确的属性,System.Text.Json现在是默认属性):

public class ObjectB
{
    public Guid Id { get; set; }
    public Guid RefId { get; set; }
    // ...some other properties, up to 100 columns in some cases
    [JsonIgnore]
    public virtual ObjectA RefObj { get; set; }
}

看起来你试图重用你的EF实体来作为API模型--一般情况下我建议不要这样做。创建特殊的类来作为入站和出站模型(DTO),并将它们Map到数据库实体(你可以使用现有的Map器库来减少代码量,AutoMapperMapstermapperly和其他)。

相关问题