c# - 使用构造函数 Swagger 设置属性

标签 c# swagger asp.net-core-webapi swashbuckle

我正在构建一个 API 并使用 swagger 来测试端点。我有一个 ProductDTO:

public string ProductName { get; set; }
.
.
.
public Price Price { get; set; }

在此 DTO 中,我想使用在整个代码中使用的 Price 类。价格等级如下所示:

public class Price
{
    public Price(decimal amount, string currency)
    {
        Amount = amount;
        Currency = currency;
    }

    public decimal Amount { get; private set; }
    public string Currency { get; private set; }
}

但由于在 Price 类中使用了私有(private) setter ,我无​​法使用 swagger 设置这些值(它具有 readonly 属性)。我真的很喜欢这种拥有私有(private) setter 并使用构造函数设置值的方法,顺便说一句,这是公开的。有什么方法可以使用 swagger 为 Price 类设置值,并且仍然对属性使用私有(private) setter?

最佳答案

更新:我最初的回答(见下文)是不可能的,但是,这实际上取决于项目中使用的序列化库。

例如 Newtonsoft 的 Json.NET允许您通过构造函数设置类的一些属性(注意:如果您的类带有多个构造函数,请应用 JsonConstructorAttribute ):

public class Price
{
    [JsonConstructor]
    public Price(decimal amount, string currency)
    {
        Amount = amount;
        Currency = currency;
    }

    public decimal Amount { get; private set; }
    public string Currency { get; private set; }
}

原始答案

不,这是不可能的。因为如果您将您的属性保持私有(private)并仅通过构造函数初始化它们,您的反序列化器将不知道这些属性应该如何映射到您的后端 (DTO) 模型。

因此,在使用 DTO 时,您通常不会看到有人通过构造函数进行初始化。

此外,由于您在整个代码中都使用了 Price 类,因此您将“域模型”与“ View 模型”(= 用于与客户通信的模型)混合在一起——这是一种务实的方法,但不是提倡像 DDD 这样的风格。在这种情况下,如果您想要在您的属性上使用不同的属性或不同的访问修饰符,您应该创建一个专用的 PriceDTO 映射到您的 Price 实体,但具有公共(public) setter 和 getter。

另一种选择是将发送数据到客户端(通过 GET)的端点使用的模型与接收数据作为有效负载以创建或更新事物(通过 POST/PATCH/放)。然而,这通常以冗余为代价,因为两种情况下的模型通常高度相似。

关于c# - 使用构造函数 Swagger 设置属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52942002/

相关文章:

c# - 在 Visual Studio 2010-沙盒解决方案中添加对第 3 方 DLL 的引用

c# - 如何将swagger导入带环境的 postman ?

jakarta-ee - Swagger 2.x JaxrsAnnotationScanner 找不到位于 ear 中的资源类

c# - 无法解析 'Swashbuckle.AspNetCore.Swagger.ISwaggerProvider' 类型的服务

c# - 使用官方 C# 驱动程序在 Mongo DB 中进行更新插入

C# Linq 查询在多个文本文件中搜索单个关键字

c# - AddToRole 失败并在用户名中输入 + 号?

java - 如何在 SwaggerUI 中创建自定义 POST 请求正文

c# - 在 .net 核心 webapi Controller 中接受 byte[]

asp.net-web-api - 具有Web API AuthorizeAttribute角色的Azure AD OAuth客户端凭据授予流