使用构造函数在 swagger 中设置属性

Ram*_*nas 6 c# swagger swashbuckle asp.net-core-webapi

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

public string ProductName { get; set; }
.
.
.
public Price Price { get; set; }
Run Code Online (Sandbox Code Playgroud)

在这个 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; }
}
Run Code Online (Sandbox Code Playgroud)

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

B12*_*ter 3

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

\n\n

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

\n\n
public class Price\n{\n    [JsonConstructor]\n    public Price(decimal amount, string currency)\n    {\n        Amount = amount;\n        Currency = currency;\n    }\n\n    public decimal Amount { get; private set; }\n    public string Currency { get; private set; }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

原答案

\n\n

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

\n\n

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

\n\n

另外,由于您在整个代码中使用 Price 类,因此您将“域模型”与“视图模型”(=您用来与客户端通信的模型)\xe2\x80\x93 混合在一起,这是一种务实的方法但不提倡像DDD这样的风格。在这种情况下,如果您希望属性具有不同的属性或不同的访问修饰符,则应创建一个专用的 PriceDTO,它映射到您的 Price 实体,但具有公共 setter 和 getter。

\n\n

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

\n