gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:15:14 26 4
gpt4 key购买 nike

我正在构建一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com