ABP开发框架前后端开发系列---(5)Web API调用类在Winform项目中的使用

在前面几篇随笔介绍了我对ABP框架的改造,包括对ABP总体的介绍,以及对各个业务分层的简化,WebAPI客户端封装层的设计,使得我们基于ABP框架的整体方案越来越清晰化,也越来越接近实际的项目开发需求,一旦整个模式比较成熟,并以一种比较固化的模式来指导开发,那么就可以很方便的应用在实际项目开发当中了。本篇随笔是基于前面几篇的基础上,在Winform项目上进一步改造为实际项目的场景,把我原来基于微软...

ABP开发框架前后端开发系列---(5)Web API调用类在Winform项目中的使用

在前面几篇随笔介绍了我对ABP框架的改造,包括对ABP总体的介绍,以及对各个业务分层的简化,Web API 客户端封装层的设计,使得我们基于ABP框架的整体方案越来越清晰化, 也越来越接近实际的项目开发需求,一旦整个模式比较成熟,并以一种比较固化的模式来指导开发,那么就可以很方便的应用在实际项目开发当中了。本篇随笔是基于前面几篇的基础上,在Winform项目上进一步改造为实际项目的场景,把我原来基于微软企业库底层的数据库访问方式的Winform框架或者混合框架的字典模块界面改造为基于ABP框架基础上的字典应用模块。

1)APICaller层接口的回顾

在上一篇随笔《ABP开发框架前后端开发系列---(4)Web API调用类的封装和使用》中,我介绍了Web API调用类的封装和使用,并介绍了在.net 控制台程序中,测试对ApiCaller层的调用,并能够顺利返回我们所需要的数据。测试代码如下所示。

 #region DictType using (var client = bootstrapper.IocManager.ResolveAsDisposable<DictTypeApiCaller>()) {  var caller = client.Object;  Console.WriteLine("Logging in with TOKEN based auth...");  var token = caller.Authenticate("admin", "123qwe").Result;  Console.WriteLine(token.ToJson());  caller.RequestHeaders.Add(new NameValue("Authorization", "Bearer "   token.AccessToken));  Console.WriteLine("Get All ...");  var pagerDto = new DictTypePagedDto() { SkipCount = 0, MaxResultCount = 10 };  var result = caller.GetAll(pagerDto).Result;  Console.WriteLine(result.ToJson());  Console.WriteLine("Get All by condition ...");  var pagerdictDto = new DictTypePagedDto() { Name = "民族" };  result = caller.GetAll(pagerdictDto).Result;  Console.WriteLine(result.ToJson()); Console.WriteLine("Get count by condition ...");  pagerdictDto = new DictTypePagedDto() {};  var count = caller.Count(pagerdictDto).Result;  Console.WriteLine(count);  Console.WriteLine();  Console.WriteLine("Create DictType...");  var createDto = new CreateDictTypeDto { Id = Guid.NewGuid().ToString(), Name = "Test", Code = "Test" };  var dictDto = caller.Create(createDto).Result;  Console.WriteLine(dictDto.ToJson());  Console.WriteLine("Update DictType...");  dictDto.Code = "testcode";  var updateDto = caller.Update(dictDto).Result;  Console.WriteLine(updateDto.ToJson());  if (updateDto != null)  {Console.WriteLine("Delete DictType...");caller.Delete(new EntityDto<string>() { Id = dictDto.Id });  } } #endregion

这些ApiCaller对象的接口测试代码,包括了授权登录,获取所有记录,获取条件查询记录,创建、更新、删除这些接口都成功执行,验证了我们对整体架构的设计改良,并通过对ApiCaller层基类的设计,减少我们对常规增删改查接口的编码,我们只需要编写我们的自定义业务接口代码封装类即可。

其中基类的代码如下所示。

针对Web API接口的封装,为了适应客户端快速调用的目的,这个封装作为一个独立的封装层,以方便各个模块之间进行共同调用。

也就是说,上面我们全部是基于基类接口的调用,还不需要为我们自定义接口编写任何一行代码,已经具备了常规的各种查询和数据处理功能了。

我们完整的字典类型ApiCaller类的代码如下所示。

namespace MyProject.Caller{ /// <summary> /// 字典类型对象的Web API调用处理 /// </summary> public class DictTypeApiCaller : AsyncCrudApiCaller<DictTypeDto, string, DictTypePagedDto, CreateDictTypeDto, DictTypeDto>, IDictTypeAppService {  /// <summary>  /// 提供单件对象使用  /// </summary>  public static DictTypeApiCaller Instance  {get{ return Singleton<DictTypeApiCaller>.Instance;}  }  /// <summary>  /// 默认构造函数  /// </summary>  public DictTypeApiCaller()  {this.DomainName = "DictType";//指定域对象名称,用于组装接口地址  }  public async Task<Dictionary<string, string>> GetAllType(string dictTypeId)  {AddRequestHeaders();//加入认证的token头信息string url = GetActionUrl(MethodBase.GetCurrentMethod());//获取访问API的地址(未包含参数)url  = string.Format("?dictTypeId={0}", dictTypeId);var result = await apiClient.GetAsync<Dictionary<string, string>>(url);return result;}  public async Task<IList<DictTypeNodeDto>> GetTree(string pid)  {AddRequestHeaders();//加入认证的token头信息string url = GetActionUrl(MethodBase.GetCurrentMethod());//获取访问API的地址(未包含参数)url  = string.Format("?pid={0}", pid);var result = await apiClient.GetAsync<IList<DictTypeNodeDto>>(url);return result;  } }

这里面的函数定义才是我们需要根据实际的自定义接口封装的调用类函数代码。

前面我们介绍了,我们把ApiCaller层的项目设计为.net Standard的类库项目,因此可以在.net core或者在.net framework中进行使用,并且也在基于.net core的控制台程序中测试成功了。

下面就重点介绍一下,基于.net framework的Winfrom程序中对ABP框架的Web API接口的调用,如果以后Winform支持.net core了(据说9月份出的.net core3就包含了),那么也一样的模式进行调用。

2)Winform对ApiCaller层的调用

我们先来看看字典模块,通过封装对ABP框架的Web API调用后,实际的功能界面效果吧。

先设计一个授权登录的界面获取访问令牌信息。

字典管理界面,列出字典类型,并对字典类型下的字典数据进行分页展示,分页展示利用分页控件展示。

新增或者编辑窗体界面如下

这个界面是来自于我的框架里面的字典模块界面,不过里面对数据的处理代码确实已经更改为适应ABP框架的Web API接口的调用的了(基于ApiCaller 层的调用)。

我们下面来一一进行分析即可。

登陆界面,我们看看主要的逻辑就是调用获取授权令牌的接口,并存储起来供后续界面中的业务类进行调用即可。

https://www.guoxiongfei.cn/cntech/18387.html