码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 武装你的WEBAPI-OData与DTO


    合集 - OData(13)
    1.武装你的WEBAPI-OData入门2020-05-122.武装你的WEBAPI-OData便捷查询2020-05-133.武装你的WEBAPI-OData分页查询2020-05-184.武装你的WEBAPI-OData资源更新Delta2020-07-075.武装你的WEBAPI-OData使用Endpoint05-096.武装你的WEBAPI-OData之API版本管理05-057.武装你的WEBAPI-OData常见问题2021-02-028.武装你的WEBAPI-OData聚合查询03-27
    9.武装你的WEBAPI-OData与DTO05-08
    10.OData WebAPI实践-OData与EDM05-1111.OData WebAPI实践-Non-EDM模式05-1212.OData WebAPI实践-兼容OData集合响应05-1513.OData WebAPI实践-与ABP vNext集成05-16
    收起

    本文属于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()
                    .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), Status200OK)]
            public async Task GetAsync(string key, ODataQueryOptions options)
            {
                var insp = await _context.DeviceData.Where(w => w.DeviceId == key).GetQueryAsync(_mapper, options);
                return Ok(insp);
            }
    

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

    参考资料

    • AutoMapper/AutoMapper.Extensions.OData: Creates LINQ expressions from ODataQueryOptions and executes the query. (github.com)
  • 相关阅读:
    Parallel 与 ConcurrentBag<T> 这对儿黄金搭档(C#)【并发编程系列_2】
    WKHtmltoPdf
    面试官:Java中缓冲流真的性能很好吗?我看未必
    计算未来:微软眼中的人工智能
    部署redis的读写分离架构(包含节点间认证口令)
    java计算机毕业设计列车票务信息管理系统源程序+mysql+系统+lw文档+远程调试
    数据同步、
    关于 spring boot 的目录详解和配置文件
    linux 上设置系统时间
    以K近邻算法为例,使用网格搜索GridSearchCV优化模型最佳参数
  • 原文地址:https://www.cnblogs.com/podolski/p/17380728.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号