站点图标 江湖人士

JHRS开发框架之第三方类库选型,3个主要库介绍

asp.net core异步编程最佳实践

asp.net core异步编程最佳实践

JHRS开发框架之第三方类库选型,这个系列的文章旨在记录工作中使用WPF开发新的医疗项目中,有感于必须统一掉一些规范上的事情,并且提高团队开发效率,遂折腾了这么一个半吊子的框架,这个标题WPF企业级开发框架搭建指南,2020从入门到放弃可能会唬住一些人,但看到这些零碎文字的朋友就凑和着看吧,如果能帮助到你,那也荣幸了。

第三方类库选型

在刚开始搭建这个框架的时候,由于之前并没有WPF的开发经验,也不知道选用的这些第三方组件是否合理,但通过几天的试用和实战做一些业务功能,感觉还是挺方便的,可以节省很多的代码;在这个框架中,使用了最为主要的三个框架,分别是Prism、AspectInjector、Refit。

JHRS开发框架之第三方类库选型,3个主要库介绍 3

Prism类库的应用

Prism可以用于在WPF和Xamarin.Forms中构建松耦合,可维护和可测试的XAML应用程序的框架。每个平台都有单独的版本,Prism提供了一组设计模式的实现,这些模式有助于编写结构良好且可维护的XAML应用程序,包括MVVM,依赖项注入,命令,EventAggregator等。

因此在开发WPF程序和基于Xamarin.Forms开发App程序都是可以使用这个Prism框架的,这个框架最开始就是来自微软,现在已经交给开源社区维护,以前就在很多公司在使用,现在可以更加放心使用它来构建MVVM程序。

在开始使用Prism之前,最好花两三个小时看下Prism系列相关文章,如果之前就熟悉MVVM这种开发模式,学习和应用起来是非常的快的。

Prism开源地址:https://github.com/PrismLibrary/Prism

Prism系列相关文章

  1. .NET 5 WPF MVVM框架之Prism数据绑定
  2. .NET 5 WPF MVVM框架之Prism命令
  3. .NET 5 WPF MVVM框架Prism模块化
  4. .NET 5 WPF MVVM框架Prism事件聚合器
  5. .NET 5 WPF MVVM框架Prism区域管理器
  6. .NET 5 WPF MVVM框架Prism导航系统
  7. .NET 5 WPF MVVM框架Prism对话框服务

AspectInjector框架的应用

AspectInjector是面向切面(AOP)的基于属性的一个框架,用于创建和注入切面(injecting aspects)到 .net 程序集。我们知道使用AOP 可以把原来多行且重复的面向过程的代码进行重构,使核心代码只聚焦于原本它自己的功能或业务,这样使代码的【可读性】和【维护性】提高,从而减少重复代码。

AspectInjector开源地址:https://github.com/pamidur/aspect-injector

在开发WPF客户端的时候,有很多按钮需要调用web api来获取数据,或者做保存操作时需要调用web api接口将数据提交到远程服务器,而在执行这个按钮的事件代码中,可能包含了一些其它的功能,例如,点击某个按钮后需要在界面上显示一个转圈圈的效果(或者Loading效果),如下图所示。

当操作执行完毕后(数据加载完毕),这个转圈圈的效果消失掉,呈现结果给用户看;看似一个简单的功能,如果不加以封装的话,如果整个系统有2000处需要应用此效果的地方,则代码量开发时就需要复制2000遍了,封装了之后,则可以让相关的处理逻辑只关注于自己应该做的事情了,如下示例代码所示:

        /// <summary>
        /// 通用更改狀態方法
        /// </summary>
        /// <typeparam name="TEntity">待更改狀態實體</typeparam>
        /// <param name="entity">當前對象</param>
        [WaitComplete]
        protected override async Task<object> UpdateDataStatus<TEntity>(TEntity entity)
        {
            if (!IsDevelopment)
            {
                var model = entity as ReservationOutputDto;
                var response = await RestService.For<IReservationApi>(AuthClient).ChangeStatus(model.Id, model.Status);
                AlertPopup(response.Message, response.Succeeded ? MessageType.Success : MessageType.Error, async (d) =>
                {
                    if (response.Succeeded) await BindPagingData();
                });
                return response.Succeeded;
            }
            return null;
        }

如上代码使用方式一样,只需要在对应的方法上标记一个【WaitComplete】特性即可。在实际的项目中,您还可以根据需要编写更多的AOP类来减少重复的代码。

在框架中如何使用的可以参见这里。

Refit库拿来做什么

Refit是一个类型安全的 REST 开源库,是一套基于 RESTful 架构的 .NET 客户端实现,内部使用 HttpClient 类封装,可通过 Refit 更加简单安全地访问 Web API 接口,要使用 Refit 框架,只需要在项目中通过 NuGet 包安装器安装即可。

简单的说,Refit就是用来更加优雅的请求web api的开源库。

Refit Github地址:https://github.com/reactiveui/refit

Refit依赖的接口

Refit最终是要通过RestService类来调用相关的接口,而这个接口是和web api相对应的,来自github上的示例接口如下:

public interface IGitHubApi
{
        [Get("/users/{user}")]
        Task<User> GetUser(string user);
}

而在框架中,提供了根据swagger解析生成该接口的一个工具,生成的接口如下:

        /// <summary>
	/// 登錄接口
	/// </summary>
	[Headers("User-Agent: JHRS-WPF-Client")]
	public interface ILoginApi
	{
		/// <summary>
		/// 用戶登錄
		/// </summary>
		/// <param name="dto"></param>
		/// <returns></returns>
		[Post("/api/Login/Login")]
		Task<OperationResult<UserContext>> Login(LoginDto dto);

		/// <summary>
		/// 退出
		/// </summary>
		/// <returns></returns>
		[Post("/api/Login/Logout")]
		Task<OperationResult> Logout();
	}

框架中是如何使用的

当你在项目中引用了Refit来请求web api接口时,需要你在本地项目中定义和web api对应的接口,而该接口可以使用框架提供的工具来生成。

在上方提供的接口中的每个方法上面标记了一个【Post】特性,如果你查看源码,可以看到其标记的特性与REST一致的,【Post】、【Get】、【Put】、【Delete】、【Patch】等。

调用方式如下:

var response = await RestService.For<IReservationApi>(AuthClient).GetPageingData(request);

在框架中,使用类RestService的静态泛型方法For来调用即可;另外AuthClient这是一个登当后拿到token之后的一个HttpClient对象,因为在后续的接口中,访问 web api是需要身份认证的。AuthClient对象是在登录成功后,设置了AuthenticationHeaderValue对象的HttpClient对象,具体参考这里。

写在最后

介绍完了在搭建WPF开发框架中应用的三大框架或者库之后,下一篇将介绍一下WPF调用Web API封装是怎样一步一步重构成现在的这个样子。

本系列相关阅读

  1. WPF企业级开发框架搭建指南(启示录)
  2. JHRS开发框架之基础类库
  3. JHRS开发框架之第三方框架选型
  4. JHRS开发框架之WPF调用Web API封装
  5. JHRS开发框架之客户端入口项目
  6. JHRS开发框架之各子系统如何整合
  7. JHRS开发框架之怎样设计合理的ViewModel基类
  8. JHRS开发框架之公用组件用户控件的封装
  9. JHRS开发框架之建议遵循的一些建目录文件原则
  10. JHRS开发框架之WPF数据验证
  11. JHRS开发框架之ViewModel相互传参和弹框回传参的解决办法
  12. JHRS开发框架之踩坑记(终章)
退出移动版