武装你的WEBAPI-OData与DTO

这篇具有很好参考价值的文章主要介绍了武装你的WEBAPI-OData与DTO。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文属于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 查询。使用的时候要注意,如果有导航属性,导航属性也需要配置映射。文章来源地址https://www.toymoban.com/news/detail-436285.html

参考资料

  • AutoMapper/AutoMapper.Extensions.OData: Creates LINQ expressions from ODataQueryOptions and executes the query. (github.com)

到了这里,关于武装你的WEBAPI-OData与DTO的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OData WebAPI实践-与ABP vNext集成

    本文属于 OData 系列文章 ABP 是一个流行的 ASP. NET 开发框架,旧版的的 ABP 已经能够非常好的支持了 OData ,并提供了对应的 OData 包。 ABP vNext 是一个重新设计的,面向微服务的框架,提供了一些非常有用的特性,包括分页查询等但是它并不能原生支持 OData ,我们需要自行实现

    2024年02月04日
    浏览(38)
  • OData WebAPI实践-Non-EDM模式

    本文属于OData系列文章 前文说到了 EDM 与 OData 之间的关系,具有 EDM 的 OData 提供了强大的查询能力,但是 OData 并不必须要配置 EDM ,我们也可以使用 Non-EDM 方案。 所谓 Non-EDM ,并不是说在 OData 运行时不需要 EDM 配置了,而是由 OData 动态生成的 EDM ,进而实现 OData 功能。 配置

    2024年02月04日
    浏览(35)
  • 【Cesium创造属于你的地球】相机系统

    相机系统里面有 setView,flyTo,lookAt,viewBoundingsphere 这几种方法,以下是相关的使用方法,学起来!!! 该方法可以直接切换相机视口,从而不需要通过一个飞入的效果切换 flyTo该方法可以直接切换相机视口,从而不需要通过一个飞入的效果切换 方法使用,lookAt方法一般适用

    2024年02月06日
    浏览(46)
  • 10分钟训练属于你的AI变声器

    今天推荐一款开源AI变声器,安装过程很友好,不用经历各种麻烦的环境问题, 作者提供了windows下的安装包,一键安装启动很方便。 目前好像对显卡有要求,nvidia显卡支持,amd显卡不支持。 功能特点 使用top1检索替换输入源特征为训练集特征来杜绝音色泄漏 即便在相对较差

    2024年02月16日
    浏览(50)
  • 零基础,零成本,部署一个属于你的大模型

    前言 看了那么多chatGPT的文章,作为一名不精通算法的开发,也对大模型心痒痒。但想要部署自己的大模型,且不说没有算法相关的经验了,光是大模型占用的算力资源,手头的个人电脑其实也很难独立部署。就算使用算法压缩后的大模型,部署在个人电脑上,还要忍受极端

    2024年02月07日
    浏览(45)
  • 外汇天眼:在交易中有多少属于你的行情?

    期货、股票、外汇不同的市场有着不同的特性,就一个市场而言,也不会是每一段行情都适合你。 刚刚进入期货、股票、外汇市场的朋友都会被其巨大的财富效应所震慑:还有这样赚钱的? 而且机会比比皆是,一夜暴富不是神话呀。 他们依靠自己的欣喜、陶醉、冲动进行着

    2024年02月04日
    浏览(48)
  • 「AIGC」如何助力个人创意,打造属于你的独特时代?

    当今时代,人工智能(AI)不仅仅是科幻电影中的概念,也已经广泛应用于各行各业。其中,AI在创意领域的应用越来越受到关注。从AI生成的诗歌、绘画、音乐等作品的出现,到AI辅助创意产生的创意设计、广告营销等领域的应用,都为我们展示了AI在创意领域的无限可能。 AI生

    2024年02月11日
    浏览(55)
  • 如何真正“不花一分钱”部署一个属于你的大模型

    看了那么多chatGPT的文章,作为一名不精通算法的开发,也对大模型心痒痒。但想要部署自己的大模型,且不说没有算法相关的经验了,光是大模型占用的算力资源,手头的个人电脑其实也很难独立部署。就算使用算法压缩后的大模型,部署在个人电脑上,还要忍受极端缓慢的

    2023年04月22日
    浏览(49)
  • AIGC时代,基于云原生 MLOps 构建属于你的大模型(上)

      为了满足企业在数字化转型过程中对更新迭代生产力工具的需求,灵雀云近日推出了云原生 MLOps 解决方案,帮助企业快速落地AI技术、实现智能化应用和服务。 随着信息化技术的不断发展,企业在数字化转型的过程中,需要不断地更新迭代生产力工具,从最早的将物理世界

    2024年02月11日
    浏览(43)
  • AIGC时代,基于云原生 MLOps 构建属于你的大模型(下)

    为了满足企业在数字化转型过程中对更新迭代生产力工具的需求,灵雀云近日推出了Alauda MLOps 解决方案,帮助企业快速落地AI技术、实现智能化应用和服务。 随着ChatGPT的爆火,越来越多的人考虑使用AI来提升我们日常工作的效率和质量,通过对话协助生成需要的文本数据。无

    2024年02月12日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包