其他分享
首页 > 其他分享> > 使用构造函数来设置属性

使用构造函数来设置属性

作者:互联网

我正在构建一个API,并使用摇摇欲坠来测试端点.我有一个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; }
}

但是,由于在价格类中使用了私有的设置器,所以我不能使用摇摇欲坠来设置这些值(它具有只读属性).我真的很喜欢这样的方法:拥有私有的setter和使用构造函数设置值,这是公共的.我有什么办法可以使用招摇设置Price类的值,而仍然在属性上使用私有设置器?

解决方法:

更新:我的原始答案(请参见下文)是不可能的,但是,这实际上取决于项目中使用的序列化库.

例如,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; }
}

原始答案

不,这是不可能的.因为如果您将属性设为私有,并且仅通过构造函数对其进行初始化,则反序列化器将不知道这些属性应如何映射到您的后端(DTO)模型.

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

这是一种务实的做法,但在风格不提倡的 – 而且,由于使用的是整个代码的舱位价格,你与你的“视图模式”(=你的模型使用与客户端进行通信)将您的“领域模型”像DDD.在这种情况下,如果要在属性上使用不同的属性或不同的访问修饰符,则应创建一个专用的PriceDTO,该DTO映射到Price实体,但具有公共设置方法和获取方法.

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

标签:swashbuckle,asp-net-core-webapi,swagger,c
来源: https://codeday.me/bug/20191108/2008228.html