武装你的WEBAPI-OData与DTO
前面写了很多有关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-OData与DTO的更多相关文章
- OData – the best way to REST–实例讲解ASP.NET WebAPI OData (V4) Service & Client
一.概念介绍 1.1,什么是OData? 还是看OData官网的简单说明: An open protocol to allow the creation and consumption of quer ...
- AspNet WebApi OData 学习
OData介绍:是一个查询和更新数据的Web协议.OData应用了web技术如HTTP.Atom发布协议(AtomPub)和JSON等来提供对不同应用程序,服务 和存储的信息访问.除了提供一些基本的操 ...
- AspNet.WebAPI.OData.ODataPQ
AspNet.WebAPI.OData.ODataPQ实现WebAPI的分页查询服务 AspNet.WebAPI.OData.ODataPQ实现WebAPI的分页查询服务-(个人拙笔) AspNet. ...
- AspNet.WebAPI.OData.ODataPQ实现WebAPI的分页查询服务-(个人拙笔)
AspNet.WebAPI.OData.ODataPQ 这是针对 Asp.net WebAPI OData 协议下,查询分页.或者是说 本人在使用Asp.Net webAPI 做服务接口时写的一个分页 ...
- 主攻ASP.NET MVC4.0之重生:Asp.Net MVC WebApi OData
1.新建MVC项目,安装OData Install-Package Microsoft.AspNet.WebApi.OData -Version 4.0.0 2.新建WebAPI Controller ...
- AspNet.WebAPI.OData.ODataPQ实现WebAPI的分页查询服务-(个人拙笔)(转)
出处:http://www.bubuko.com/infodetail-827612.html AspNet.WebAPI.OData.ODataPQ 这是针对 Asp.net WebAPI ODat ...
- [转]Composite Keys With WebApi OData
本文转自:http://chris.eldredge.io/blog/2014/04/24/Composite-Keys/ In our basic configuration we told the ...
- [转]OData – the best way to REST–实例讲解ASP.NET WebAPI OData (V4) Service & Client
本文转自:http://www.cnblogs.com/bluedoctor/p/4384659.html 一.概念介绍 1.1,什么是OData? 还是看OData官网的简单说明: An open ...
- webAPi OData的使用
一.OData介绍 开放数据协议(Open Data Protocol,缩写OData)是一种描述如何创建和访问Restful服务的OASIS标准. 二.OData 在asp.net mvc中的用法 ...
- 基于Angular+WebAPI+OData的增删改查
对于在ASP.NET WebAPI中怎么使用OData,已经在我前面的日志中的说明, 在ASP.NET Web API中使用OData 在这个示例中.我新建了一个Order的实体,在前端使用Angul ...
随机推荐
- C# 循环给多个连续编号的控件赋值
C# 循环给多个连续编号的控件赋值 我们经常在 winform 界面上用很多文本框用来显示一组数据,文本框前面有Label标识.我们得到的数据也经常是一个list 或者数组的形式的.需要给这些文本框赋 ...
- .net core中使用HttpClient碰到的问题:This instance has already started one or more requests. Properties can only be modified before sending the first request
项目里使用httpclient一般加staic或者单例来防止每次请求都会新建立一个连接,从而占用太多的服务器资源, 问题产生 但是今天新加的一个方法中每次需要请求不同的url,这时候就出现了错误: 就 ...
- lnmp重新安装mysql
安装mysql好长时间,一直没去管,后来一直频繁重启,各种网上找方案去解决,最后问题太异常,一顿操作猛如虎之后把mysql彻底搞垮,无奈只能进行重装. whereis mysql mysql: /us ...
- What is Weight Lifting?
Weight lifting is the process of lifting items of great mass in order to increase the muscle size an ...
- 在VS中C#工程操作Mysql数据库
1.实现mysql数据库与VS的连接,需要安装两个插件,作者装的是mysql-connector-net-6.9.9.msi和 mysql-for-visualstudio-1.2.6.msi. 2. ...
- 关于Android开发工具的下载之ADT篇
ADT的下载 首先可以选择下面推荐的两个网站去下载相应的安装包,网址如下: http://tools.android-studio.org/index.php/adt-bundle-plugin 或者 ...
- URule规则引擎
没有规则,不成方圆: 一.背景 前段时间,在做项目重构的时候,遇到很多地方需要做很多的条件判断.当然可以用很多的if-else判断去解决,但是当时也不清楚怎么回事,就想玩点别的.于是乎,就去调研了规则 ...
- Apk_动态调试方案
环境准备 安装夜神安卓模拟器 配置好adb[Android 调试桥]环境(这里需要使用官方的adb环境,设置好环境变量)Android 调试桥 (adb) | Android 开发者 | Androi ...
- 卡特兰路径和q,t-enumeration 学一半的笔记
目录 卡特兰 The1st q-analogue of \(C_n\) The 2nd q-analogue of \(C_n\) /定义\(C_n(q)\) The q-Vandermonde co ...
- 程序员必须掌握的java进制转换(全网最详细讲解)
前言 在上一篇文章中,壹哥给大家讲了Java里的各种运算符.其中在讲解位运算符时,我给大家提到了计算机中进制的概念.但是现在很多小白同学,对进制的概念还不够了解,比如二进制.八进制.十六进制都是怎么回 ...