首页 > 其他分享 >武装你的WEBAPI-OData与DTO

武装你的WEBAPI-OData与DTO

时间:2023-05-08 09:36:30浏览次数:45  
标签:WEBAPI DTO 对象 OData 使用 AutoMapper deviceData

本文属于OData系列文章

Intro

前面写了很多有关OData使用的文章,很多读者会有疑问,直接将实体对象暴露给最终用户会不会有风险?$expand在默认配置的情况下,数据会不会有泄露风险?

答案是肯定的,由于OData的特性,提供给我们便捷同时也会带来一些风险。很多地方推荐使用DTO模式来隔离实体类与最终用户使用到类的关系,从而解决以上两个问题,OData同样也适用。

DTO

DTO代表Data Transfer Object,是一种设计模式,用于在不同层之间传输数据。它通常用于将数据从一个应用程序的逻辑层传输到另一个应用程序的界面层或持久化层,以及在分布式系统中传输数据。

DTO对象是纯数据对象,它包含要从一个应用程序传输到另一个应用程序的数据。它不包含业务逻辑或数据访问代码,因此它们不能直接与数据库交互或执行任何操作,而只是简单地保存数据。

DTO对象通常由开发人员创建,并且可以根据需要进行扩展。它们可以包含各种属性和方法,以提供使用方便和更好的可读性。使用DTO对象可以降低耦合度,使不同层之间的数据传输更加简单和安全。

AutoMapper

我们需要将实体对象与DTO进行转换,对于需要转换数量不是很多的情况,直接编写一个转换函数就方便了。

    public static class DeviceDataExtension
    {
        public static DeviceDataDto ToDeviceDataDto(this Datum deviceData)
        {
            if (deviceData == null) return null;
            DeviceDataDto deviceDataDto = new()
            {
                DataArray = deviceData.DataArray,
                DeviceId = deviceData.DeviceId,
                Timestamp = deviceData.Timestamp,
                Id = Guid.NewGuid().ToString()
            };
            return deviceDataDto;
        }
    }

但是如果需要映射的属性很多,或者有很多对象的情况,建议使用对象映射工具:AutoMapper。基础用法不详细说了,讲讲对OData的支持。

首先安装对OData支持的包,由于我使用默认的DI,还需要安装DI支持的包:

Install-Package AutoMapper.Extensions.Microsoft.DependencyInjection
Install-Package AutoMapper.AspNetCore.OData.EFCore

然后有三个要求:

  • 一定要对对象声明显示展开(explicit expansion)。
  • 调用IMapper的GetAsync()或者GetQueryAsync()方法。
  • 不能在Controller或者方法上使用[EnableQuery]特性:这个我熟,因为GetQueryAsync()函数需要利用ODataQueryOptions参数,如果同时使用[EnableQuery]会导致对结果再进行一次筛选,导致返回数据错误。

代码:

            services.AddAutoMapper(option =>
            {
                option.CreateMap<Datum, DeviceDataDto>()
                .ForMember(dest => dest.Id, opt => opt.MapFrom(src => Guid.NewGuid().ToString()))
                .ForPath(dest => dest.DataArray, opt => opt.MapFrom(src => src.DataArray))
                .ForAllMembers(w => w.ExplicitExpansion());
            });

        public DeviceDatasController(IMapper mapper)
        {
            _mapper = mapper;
        }
        
        [HttpGet]
        [ProducesResponseType(typeof(IEnumerable<DeviceDataDto>), Status200OK)]
        public async Task<IActionResult> GetAsync(string key, ODataQueryOptions<DeviceDataDto> options)
        {
            var insp = await _context.DeviceData.Where(w => w.DeviceId == key).GetQueryAsync(_mapper, options);
            return Ok(insp);
        }

这样,我们就可以正常使用 OData,同时也享受了的 DTO 的好处,即可以对 DeviceDataDto 使用的 OData 查询。使用的时候要注意,如果有导航属性,导航属性也需要配置映射。

参考资料

标签:WEBAPI,DTO,对象,OData,使用,AutoMapper,deviceData
From: https://www.cnblogs.com/podolski/p/17380728.html

相关文章

  • 高通量测序分析工具Bedtools使用介绍
    Bedtools是处理基因组信息分析的强大工具集合,其主要功能如下:bedtools:flexibletoolsforgenomearithmeticandDNAsequenceanalysis.usage:bedtools<subcommand>[options]Thebedtoolssub-commandsinclude:[Genomearithmetic]intersectFindove......
  • ListToDataTable
    1///<summary>2///ListtoDataTable3///</summary>4///<typeparamname="T"></typeparam>5///<paramname="list">List数据</param>6///<returns></returns>7publicstaticSy......
  • 武装你的WEBAPI-OData Versioning
    本文属于OData系列目录武装你的WEBAPI-OData入门武装你的WEBAPI-OData便捷查询武装你的WEBAPI-OData分页查询武装你的WEBAPI-OData资源更新Delta武装你的WEBAPI-OData之EDM武装你的WEBAPI-OData常见问题武装你的WEBAPI-OData使用Endpoint武装你的WEBAPI-OData聚合查询......
  • java 手动校验dto
    1在Java中进行手动校验DTO的方法有很多种,这里提供一种常用的校验方法,使用HibernateValidator实现:231.添加依赖45首先需要在Maven或Gradle中添加HibernateValidator的依赖:67Maven:89```xml10<dependency>11<groupId>......
  • WebAPi实现多文件上传,并附带参数
    1、目的及需求需要实现的效果为,通过WebAPI实现多文件上传功能,并且在上传时需要能附带文件说明参数,用于保存文件记录 2、参数说明这里先说明以下需要的文件说明参数类///<summary>///前端文件上传时参数数据///</summary>publicclassDistributionDat......
  • Android dtbo(2) dto语法
    设备树源(DTS,devicetreesource)格式是设备树的文本表示形式。设备树编译器(DTC)可将这种格式处理为二进制设备树,这是Linux内核要求的形式。1.使用引用DTC(DeviceTreecompiler+overlaypatches)项目在dtc-format.txt和manual.txt中说明了DTS格式。在dt-object-......
  • Android dtbo(1) dto简介
    设备树(DT,DeviceTree)是用于描述non-discoverable(google这样写的,意思应该就是硬件信息看不到)硬件的命名节点和属性构成的一种数据结构。操作系统(例如在Android中使用的Linux内核)会使用DT来支持Android设备使用的各种硬件配置。硬件供应商会提供自己的DT源文件,......
  • 常见问题——关于.net WebApi使用Swagger报错:HTTP Error 403.14 - Forbidden
    问题:.netWebApi项目使用Swagger报错:HTTPError403.14-Forbidden解放方案:换一个端口即可推荐——删除解决方案下的.vs文件夹,重新生成即可参考:https://stackoverflow.com/questions/34970088/swagger-gives-me-http-error-403-14-forbidden/53863456......
  • WebAPI中添加参数,并获取数据
    publicstaticstringPostData(DataTabledt,intm){stringstrPostData=ConfigurationManager.AppSettings["APIPost"].ToString();//"http://218.78.103.37:43333/api/pushData";//dt=newArich......
  • Data source is not a transactional CDS view [OData Exposure]
    一个朋友遇到问题:给ABAPCDSview添加OData.publish:true注解激活之后,期望自动生成OData服务,但是遇到错误消息:DatasourceisnotatransactionalCDSview[ODataExposure]SAP社区上有人问类似的问题:https://answers.sap.com/questions/78804/cds-view-annotati......