ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

使用构造函数来设置属性

2019-11-08 13:05:35  阅读:273  来源: 互联网

标签:swashbuckle asp-net-core-webapi swagger c


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有