紧接上一篇《基于Asp.Net Core打造轻量级内部服务治理RPC(一)》文章。本文主要讲解基于Asp.Net Core的远程服务设计和实现。
在上一篇中讲过,服务提供者提供的服务实际上就是一个Controller,那么是否在该程序中,服务都按照Asp.Net Core 中的Web Api的方式建立好Controller,再实现每个服务接口(调用方只需要引用对应的接口定义所在的程序集)供调用者调用呢?至少我不愿意这样去设计。
在Asp.Net Core中,我们可以建立Poco Controller,那么我们的服务类也就完全不需要继承Controller或者以Controller结尾来命名服务(eg:UserService)。要做到这一点,在Asp.Net Core中非常方便,只需要扩展两个类:
1、从ControllerFeatureProvider派生出一个自己的Provider
2、实现IApplicationModelConvention接口
下面就细说一下这两个类的作用,以及如何使用:
派生自ControllerFeatureProvider的类ServiceHubControllerFeatureProvider主要是用来将我们自己定义的服务类(即Poco Controller)认定成Controller,重写其里面的核心方法就是bool IsController(TypeInfo typeInfo)。下面是实现的代码:
当我们有了ServiceHubControllerFeatureProvider这个类来把我们的服务类提供成Controller后,我们需要对我们的服务类进行路由,Filter等应用,那么这个时候IApplicationModelConvention接口的实现类ServiceHubConvention就登场了。
ServiceHubConvention类实现IApplicationModelConvention接口的Apply方法在,在该类中就可以通过ApplicationModel 获取ControllerModel,根据ControllerMode可以获取ActionMode,进而获取ParameterModel,是不是就是我们的Mvc的那一套结构了,通过每一层结构,我们可以通过代码指定对应的路由等一系列设置(只是我们平时在写Web Api Controller是直接打上的特性而已^_^)。
我们重写和派生出这两个将一般类转换成Asp.Net Core中的Controller类后,如何使用呢?其实很简单。通过IServiceCollection 接口获取到ApplicationPartManager类,然后在该类的FeatureProviders属性Insert派生的ServiceHubControllerFeatureProvider类实例即可;ServiceHubConvention类则只需要在配置MvcOptions时将其添加到Conventions属性即可。
通过以上的扩展就可以将我们的服务类实现成Controller,就基本实现远程调用的雏形。有兴趣的朋友可以留言交流也可以加qq:418237014交流。
网友评论