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