开发者社区> 另一个老李> 正文

使用.NET Core搭建分布式音频效果处理服务(六)让Middleware自动Invoke

简介:   为何要用中间件来实现音频处理的监听服务 当然也可以使用Startup来进行服务的自启动,或者也可以使用quartz定时调度任务来启动音频服务,大家随意。 笔者认为使用中间件的目的,是为了分离应用和服务,也是一种解耦手段。
+关注继续查看

 

为何要用中间件来实现音频处理的监听服务

当然也可以使用Startup来进行服务的自启动,或者也可以使用quartz定时调度任务来启动音频服务,大家随意。

笔者认为使用中间件的目的,是为了分离应用和服务,也是一种解耦手段。

我们知道,在NETCORE中的中间件,有点类似像AOP的一种实现形式,他的调用方式是通过Request=>Middleware=>next=>custom logic=>Response。我们可以用来做日志记录、权限验证、事物处理,多个中间件形成一个处理管道,甚至可以实现自定义的MVC和依赖注入。

 

创建一个中间件

为了便于区分,我们扩展一个名为“MediaHandlers”的IApplicationBuilder

 1     public static class MediaHandlers
 2     {
 3         public static IApplicationBuilder UseMediaAudioHandlerMiddleware(this IApplicationBuilder builder,
 4             MediaAudioOptions options)
 5         {
 6             if (builder == null)
 7                 throw new ArgumentNullException(nameof(builder));
 8 
 9             return builder.UseMiddleware<MediaAudioMiddleware>(options);
10         }
11     }

再创建一个名为“MediaAudioMiddleware”的中间件,其实就是一个实现类,但需要传递对象RequestDelegate做请求代理。

并且,我们将在中间件中实现依赖注入,而中间件的依赖注入却无法通过构造函数的方式进行注入,需要通过Invoke来实现依赖注入,完整代码如下:

 1 public async Task Invoke(HttpContext context,
 2             IDataOpService iDataOpService,
 3             ICacheAsyncService iCacheAsyncService,
 4             IMsgBusService imsgBusService,
 5             IHostingEnvironment iHostingEnvironment)
 6         {
 7             _dataOpService = iDataOpService;
 8             _iMsgBusService = imsgBusService;
 9             _iCacheAsyncService = iCacheAsyncService;
10             _ihostingEnvironment = iHostingEnvironment;
11 
12             await _next(context);
13         }

跟之前的控制器注入的内容类型是一样的。然后我们再来看看构造函数中需要实现的一些事情:

public MediaAudioMiddleware(RequestDelegate next, MediaAudioOptions options)
        {
            _next = next;

            Task.Factory.StartNew(() =>
            {
                Thread.Sleep(3 * 1000);
                //...需要自定义启动的方法
            });
        }    

构造函数中默认必须传递RequestDelegate类型参数,用于委托执行Request之后Response之前的代理。

将需要启动的服务已子任务(子线程)的方式交给Task工厂进行自行管理,再次分离了主管道请求应用。

但是,默认这个中间件是不会自动启动的。。。因为没有建立一个请求管道。

 

强制建立一个请求管道

笔者的思路是,通过httpclient请求主管道中的一个任意的API接口(比如你自定义实现的服务器信息接口),从而强制实现该请求管道的所有事情,比如循环,比如监听等等。参考如下:

 1                 using (var httpClient = new HttpClient())
 2                 {
 3                     httpClient.BaseAddress = new Uri($"{General.LocalHostUrl}/Info");
 4                     var r = httpClient.GetAsync(httpClient.BaseAddress).Result;
 5                     if (!r.ToString().Contains("200")) return;
 6                     Console.WriteLine("MediaAudioMiddleware Running");
 7                     var mediaHandler = new AudioHandlerWorkUnit(iDataOpService: _dataOpService,
 8                         iCacheAsyncService: _iCacheAsyncService,
 9                         imsgBusService: _iMsgBusService,
10                         iHostingEnvironment: _ihostingEnvironment,
11                         millsSeconds: options.MillsSeconds
12                     );
13                     mediaHandler.DoStart();
14                 }

当然,需要在命令参数中(或前置参数中约束该管道只建立一次),也许笔者的实现方式欠妥,如果你有更好的方法,欢迎交流。

 

感谢阅读

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Vue3 的 Reactive 响应式到底是什么
​Vue 3 除了令人钦佩的性能改进,还带来了一些新功能。可以说,最重要的介绍是 `Composition API` 。在本文的第一部分中,我们将概括 Vue3 创建新 API 的动机:即,更好的组织和重用代码。在第二部分中,我们将重点讨论使用新API时较少讨论的方面,例如响应式特性。我将响应式特性其称为按需响应。
9 0
快将你的 React 应用迁移到 Vite 吧,速度太快啦
我们大多数人将使用 Create React App 来创建 React App。 它支持所有开箱即用的配置。 但是,当您的项目代码增长时,您可能会面临更高的构建时间、开发服务器的启动速度变慢并等待 2 到 5 秒以反映您在代码中所做的更改,并且当应用程序大规模增长时,这可能会迅速增加。
10 0
14 行 CSS 代码实现明暗模式
最近我打算对我的个人网站添加明暗模式的自动检测。这个解决方案不使用 JavaScript。相反,它通过CSS 媒体查询来检测用户的系统设置,并使用两个自定义CSS属性来确定一个基本的配色方案。
7 0
consul技术分享
上一章《注册中心Eureka》我们介绍了注册中心Eureka,相必大家都对注册中心都有了一定的认识了,在Eureka停止维护之后,Consul就成了其替换方案之一,让我们一起来走进Consul的世界吧!
4 0
Android 打包AAB+PAD(java篇)(下)
Play Core API 集成 安装时分发 快速跟进式分发和按需分发 查看状态 获取有关资源包的下载信息 安装 监控下载状态 下载内容较大 获取资源包 取消请求 移除资源包 获取多个资源包的位置 相关推荐 Android aab打包 Android App Bundle 已取代 APK
8 0
一文搞懂SaaS、PaaS、IaaS的概念和异同
一文搞懂SaaS、PaaS、IaaS的概念和异同
7 0
Swift-进阶 13:协议Protocol
Swift-进阶 13:协议Protocol
6 0
【XML入门】一篇文章让你从没听过到熟练运用
今天我们继续来学习【Java Web】部分的XML,XML相比其他部分来时还是非常简单的。我们在以后写大项目时候也会经常用到,所以说还是蛮重要的。
6 0
SpringMVC面试题大总结
Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。
6 0
+关注
另一个老李
目前不知道介绍啥
27
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载