关键词:
前言
本篇幅会专门记录在工作中实际碰到的问题场景,和一些比较好的实现方法作为汇总,可以供各位借鉴和参考,当然 本人入行不深,能力有限,仅供各位借鉴和参考。欢迎补充
技巧一:引入其他项目类库文件
做项目大家都知道会有远程请求API的情况,现在假设做API的项目你能接触到并且Git下来。那么继续往下看。
将API项目中用到的Dto引入自己项目。这样方便我们将请求到的json字符串直接序列化成dto,然后再转成我们自己需要的ViewModel,具体怎么转呢,往下看:
技巧二:使用Extension
使用Extension,具体怎么用,我们来用一个实际例子说一下吧。比如,我们现在要请求一个所有俱乐部的api。首先我们定义一个ViewModel用于存放俱乐部信息,Model如下:
①定义ViewModel
public class ClubBase /// <summary> /// 主键Id /// </summary> public long Id get; set; /// <summary> /// 俱乐部名称 /// </summary> public string Name get; set; /// <summary> /// 俱乐部描述 /// </summary> public string Description get; set; /// <summary> /// 创始人 /// </summary> public string Creator get; set; /// <summary> /// 创建年份 /// </summary> public int Year get; set; /// <summary> /// 其他信息 /// </summary> public string Contactor get; set; /// <summary> /// 手机号 /// </summary> public string Phone get; set; /// <summary> /// 地址 例如 中国/深圳 /// </summary> public string Address get; set; /// <summary> /// 日期 /// </summary> public DateTime CreationDate get; set;
②编写接口
/// <summary> /// 所有接口信息 /// </summary> public interface IDataServices /// <summary> /// 获取所有俱乐部 /// </summary> /// <returns></returns> Task<IList<ClubBase>> GetClubs();
③实现Server接口
/// <summary> /// 接口实现类 动态请求api获取相应数据 /// </summary> public class DataServices: IDataServices private readonly IDataHttpServers _dataHttpServers; public DataServices(IDataHttpServers dataHttpServers) _dataHttpServers = dataHttpServers; public async Task<IList<ClubBase>> GetClubs() var clubsModelList = await _dataHttpServers.GetClubs(); return clubsModelList;
④编写Http请求接口
public interface IDataHttpServers /// <summary> /// 获取所有俱乐部 /// </summary> /// <returns></returns> Task<IList<ClubBase>> GetClubs();
⑤实现此接口
/// <summary> /// 返回俱乐部列表 /// </summary> /// <returns></returns> public async Task<IList<ClubBase>> GetClubs() return await Task.Run(() => GetClubApi());
/// <summary> /// 获取所有俱乐部API /// </summary> /// <returns></returns> public List<ClubBase> GetClubApi() var list = HttpHelper.GetApi<string>("getclub"); List<ClubBase> viewClubList = new List<ClubBase>(); try List<ClubInfoDto> apiClubList = JsonConvert.DeserializeObject<List<ClubInfoDto>>(list); foreach (var item in apiClubList) //调用拓展方法解耦dto于ViewModel的赋值操作 var club = item.TranslateToClubBaseViewModel(); viewClubList.Add(club); catch (Exception e) //请求接口api异常,异常描述 list return viewClubList;
重头戏也就是此方法了,其中 可以将请求api单独抽离出来写成泛型方法,此处是这样抽离的:
/// <summary> /// HTTPclient 泛型抽象类 /// </summary> public static class HttpHelper public static T GetApi<T>(string apiName, string pragm = "") var client = new RestSharpClient($"SiteConfig.GetSite("Url")"); var request = client.Execute(string.IsNullOrEmpty(pragm) ? new RestRequest($"SiteConfig.GetSite($"apiName")", Method.GET) : new RestRequest($"SiteConfig.GetSite($"apiName")/pragm", Method.GET)); if (request.StatusCode != HttpStatusCode.OK) return (T)Convert.ChangeType(request.ErrorMessage, typeof(T)); T result = (T)Convert.ChangeType(request.Content, typeof(T)); return result;
这里我请求API是使用的RestSharp提供的请求方法。具体可以看这儿 RestSharp ,需要NuGet安装RestSharp
这里我稍微贴一下 大概常用的一些接口方法:
1)接口
/// <summary> /// API请求执行者接口 /// </summary> public interface IRestSharp /// <summary> /// 同步执行方法 /// </summary> /// <param name="request"></param> /// <returns></returns> IRestResponse Execute(IRestRequest request); /// <summary> /// 同步执行方法 /// </summary> /// <typeparam name="T">返回值</typeparam> /// <param name="request">请求参数</param> /// <returns></returns> T Execute<T>(IRestRequest request) where T : new(); /// <summary> /// 异步执行方法 /// </summary> /// <param name="request">请求参数</param> /// <param name="callback"></param> /// <returns></returns> RestRequestAsyncHandle ExecuteAsync(IRestRequest request, Action<IRestResponse> callback); /// <summary> /// 异步执行方法 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="request"></param> /// <param name="callback"></param> /// <returns></returns> RestRequestAsyncHandle ExecuteAsync<T>(IRestRequest request, Action<IRestResponse<T>> callback) where T : new();
2)实现
/// <summary> /// Rest接口执行者 /// </summary> public class RestSharpClient : IRestSharp /// <summary> /// 请求客户端 /// </summary> private RestClient client; /// <summary> /// 接口基地址 格式:http://www.xxx.com/ /// </summary> private string BaseUrl get; set; /// <summary> /// 默认的时间参数格式 /// </summary> private string DefaultDateParameterFormat get; set; /// <summary> /// 默认验证器 /// </summary> private IAuthenticator DefaultAuthenticator get; set; /// <summary> /// 构造函数 /// </summary> /// <param name="baseUrl"></param> /// <param name="authenticator"></param> public RestSharpClient(string baseUrl, IAuthenticator authenticator = null) BaseUrl = baseUrl; client = new RestClient(BaseUrl); DefaultAuthenticator = authenticator; //默认时间显示格式 DefaultDateParameterFormat = "yyyy-MM-dd HH:mm:ss"; //默认校验器 if (DefaultAuthenticator != null) client.Authenticator = DefaultAuthenticator; /// <summary> /// 通用执行方法 /// </summary> /// <param name="request">请求参数</param> /// <remarks> /// 调用实例: /// var client = new RestSharpClient("http://localhost:82/"); /// var result = client.Execute(new RestRequest("api/values", Method.GET)); /// var content = result.Content;//返回的字符串数据 /// </remarks> /// <returns></returns> public IRestResponse Execute(IRestRequest request) request.DateFormat = string.IsNullOrEmpty(request.DateFormat) ? DefaultDateParameterFormat : request.DateFormat; var response = client.Execute(request); return response; /// <summary> /// 同步执行方法 /// </summary> /// <typeparam name="T">返回的泛型对象</typeparam> /// <param name="request">请求参数</param> /// <remarks> /// var client = new RestSharpClient("http://localhost:82/"); /// var result = client.Execute<List<string>>(new RestRequest("api/values", Method.GET)); /// </remarks> /// <returns></returns> public T Execute<T>(IRestRequest request) where T : new() request.DateFormat = string.IsNullOrEmpty(request.DateFormat) ? DefaultDateParameterFormat : request.DateFormat; var response = client.Execute<T>(request); return response.Data; /// <summary> /// 异步执行方法 /// </summary> /// <param name="request">请求参数</param> /// <param name="callback">回调函数</param> /// <remarks> /// 调用实例: /// var client = new RestSharpClient("http://localhost:62981/"); /// client.ExecuteAsync<List<string>>(new RestRequest("api/values", Method.GET), result => /// /// var content = result.Content;//返回的字符串数据 /// ); /// </remarks> /// <returns></returns> public RestRequestAsyncHandle ExecuteAsync(IRestRequest request, Action<IRestResponse> callback) request.DateFormat = string.IsNullOrEmpty(request.DateFormat) ? DefaultDateParameterFormat : request.DateFormat; return client.ExecuteAsync(request, callback); /// <summary> /// 异步执行方法 /// </summary> /// <typeparam name="T">返回的泛型对象</typeparam> /// <param name="request">请求参数</param> /// <param name="callback">回调函数</param> /// <remarks> /// 调用实例: /// var client = new RestSharpClient("http://localhost:62981/"); /// client.ExecuteAsync<List<string>>(new RestRequest("api/values", Method.GET), result => /// /// if (result.StatusCode != HttpStatusCode.OK) /// /// return; /// /// var data = result.Data;//返回数据 /// ); /// </remarks> /// <returns></returns> public RestRequestAsyncHandle ExecuteAsync<T>(IRestRequest request, Action<IRestResponse<T>> callback) where T : new() request.DateFormat = string.IsNullOrEmpty(request.DateFormat) ? DefaultDateParameterFormat : request.DateFormat; return client.ExecuteAsync<T>(request, callback);
好了,我们接着上面说,大家可以看到,当我们通过请求api获取到数据之后得到的是下面这个Json字符串如下:
为什么我们需要引入api的dto而不是直接使用ViewModel来赋值我们需要的呢,这里有两个好处,第一个,我们可以快速完成json字符串到对象的转变,第二个,我们可以使用我们下面说的一个小技巧快速过滤出我们想组装的ViewModel即可。
注意下我们的这个方法TranslateToClubBaseViewModel ,是我们用于操作dto和ViewModel的主要方法
/// <summary> /// 此方法用于将Dto类型 数据 赋值到需要操作的ViewModel上 /// </summary> /// <param name="clubInfoDto">dto数据集</param> /// <returns></returns> public static ClubBase TranslateToClubBaseViewModel(this ClubInfoDto clubInfoDto) ClubBase club = new ClubBase() #region 实体按需赋值 Id = clubInfoDto.Id, Address = clubInfoDto.Address, Contactor = clubInfoDto.Contactor, Creator = clubInfoDto.Creator, Description = clubInfoDto.Description, Name = clubInfoDto.Name, Phone = clubInfoDto.Phone, Year = clubInfoDto.Year #endregion ; return club;
这样操作的好处,我们就不用维护具体的业务层,专注于ViewModel上面。达到了解耦效果。
未完待续。。。
markdownhive开发技巧汇总(代码片段)
sql小技巧(持续汇总)(代码片段)
身份证号加密selectconcat(left(`visitors`.`Card_id`,3),‘****‘,right(`visitors`.`Card_id`,4))AS`Card_id`fromuserinfo 查看详情
python常用函数技巧汇总(代码片段)
...用可以大幅精简代码。本篇博文旨在记录一些常用的操作技巧,以便重复使用时快速查阅,会持续进行更新。读取txt文件data=np.genfromtxt('./sonar.txt',delimiter=',',usecols=np.arange(0,60)通过numpy的g 查看详情
asp.netcore依赖注入最佳实践——提示与技巧(代码片段)
在这篇文章,我将分享一些在ASP.NETCore程序中使用依赖注入的个人经验和建议。这些原则背后的动机如下:高效地设计服务和它们的依赖。预防多线程问题。预防内存泄漏。预防潜在的BUG。这篇文章假设你已经基本熟悉依赖注入... 查看详情
spark常用编程技巧(代码片段)
Spark常用编程技巧文章目录Spark常用编程技巧1.基础篇1.1Scala篇1.2Spark篇2.进阶篇2.1Spark篇Spark常用编程技巧1.基础篇1.1Scala篇1.2Spark篇2.进阶篇2.1Spark篇SparkVersion:2.2.01.基础篇1.1Scala篇求均值描述:求一个Double类型的均值,含有Na... 查看详情
spark常用编程技巧(代码片段)
Spark常用编程技巧文章目录Spark常用编程技巧1.基础篇1.1Scala篇1.2Spark篇2.进阶篇2.1Spark篇Spark常用编程技巧1.基础篇1.1Scala篇1.2Spark篇2.进阶篇2.1Spark篇SparkVersion:2.2.01.基础篇1.1Scala篇求均值描述:求一个Double类型的均值,含有Na... 查看详情
20个css高级样式技巧汇总(代码片段)
使用技巧会让人变的越来越懒,没错,我就是想让你变懒。下面是我收集的CSS高级技巧,希望你懒出境界。 1.黑白图像这段代码会让你的彩色照片显示为黑白照片,是不是很酷?1img.desaturate2filter:grayscale(100%);3-webkit-filter:graysc... 查看详情
php匿名函数使用技巧(代码片段)
...$anonymousFunc=function($username)echo$username;;$anonymousFunc("乔峰!");技巧1: &nb 查看详情
原生技巧篇(代码片段)
统一设置获取/失去焦点css篇:focus-within是一个CSS伪类,表示一个元素获得焦点,或,该元素的后代元素获得焦点。换句话说,元素自身或者它的某个后代匹配:focus伪类。(shadowDOM树中的后代也包括在内)SeethePenWhyCSS:focus-within获取... 查看详情
easyuidatagrid使用技巧汇总(代码片段)
1 表头固定1当数据行很多时,会呈现垂直的滚动条,但是向下滚动,表头却被淹没了,所以需要固定表头。 datagrid.datagrid( fit:true);2 冻结表列2 当数据列很多时,会出现水平滚动条。某些... 查看详情
promptlearning教学基础篇:prompt基本原则以及使用场景技巧助力你更好使用chatgpt,得到你想要的答案(代码片段)
Promptlearning教学基础篇:prompt基本原则以及使用场景技巧助力你更好使用chatgpt,得到你想要的答案Promptlearning教学[基础篇]:prompt基本原则以及使用场景技巧助力你更好使用chatgpt,得到你想要的答案如果你想系统学习如果你对AI... 查看详情
es6常用数组操作及技巧汇总(代码片段)
常用方法1.array.concat(array1,array2,...arrayN);合并多个数组,返回合并后的新数组,原数组没有变化。constarray=[1,2].concat([‘a‘,‘b‘],[‘name‘]);//[1,2,"a","b","name"]2.array.every(callback[,thisArg]);检测数组中的每一个元素是否都通过了callback... 查看详情
javascript原生技巧篇(代码片段)
css数学函数minmaxcalc:root--box:120px.box/*width:var(--box);120px*//*width:min(var(--box),100px);100px*//*width:max(var(--box),100px);120px*//*width:calc(var(--box)-20px);100px*/height:100px;background 查看详情
javascript高级技巧篇(代码片段)
安全的类型检测在任何值上调用Object原生的toString()方法,都会返回一个[objectNativeConstructorName]格式字符串。每个类在内部都有一个[[Class]]属性,这个属性中就指定了各个类型的构造函数名。使用这种方法判断值属于什么类型... 查看详情
天池cv学习赛:街景字符识别-思路与上分技巧汇总(代码片段)
...识别比赛的正式赛已经结束。本文对一些比赛思路和上分技巧进行了汇总和整理,希望对大家深入学习CV能够有帮助。本文分为以下几部分:如何优化官方baseline的效果?其它解题思路的整理和分析字符级目标检测的... 查看详情
c语言进阶学习笔记七程序执行+调试技巧(实用技巧篇)(代码片段)
...④define宏名(参数表)字符串⑤宏和函数对比二、调试技巧篇①什么是bug?②调试是什么?有多重要?③debug和release的介绍④windows环境调试介绍⑥如何写出好(易于调试)的代码?一、程序执行篇程序的翻译环境... 查看详情
爬虫工具篇汇总(代码片段)
RequestsRequests是使用Apache2Licensed许可证的基于Python开发的HTTP库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythoner进行网络请求时,变得美好了许多,使用Requests可以轻而易举的完成浏览器可有的任何操作。功能特性... 查看详情
.netcore/.net5/.net6开源项目汇总3:工作流组件(代码片段)
...和谐开源社区。ELSAElsaCore是一个工作流库,支持在任何.NETCore应用程序中执行工作流。工作流不仅可以使用代码定义,还可以定义为JSO 查看详情