使用.NET Core搭建分布式音频效果处理服务(六)让MIddleware自动Invoke
为何要用中间件来实现音频处理的监听服务
当然也可以使用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 }
当然,需要在命令参数中(或前置参数中约束该管道只建立一次),也许笔者的实现方式欠妥,如果你有更好的方法,欢迎交流。
感谢阅读
下一篇: 同事负责照看弟弟
推荐阅读
-
使用.NET Core搭建分布式音频效果处理服务(七)使用Docker压榨性能极限
-
使用.NET Core搭建分布式音频效果处理服务(五)利用消息队列提升水平扩展灵活性
-
使用.NET Core搭建分布式音频效果处理服务(目录)
-
使用.NET Core搭建分布式音频效果处理服务(六)让MIddleware自动Invoke
-
使用.NET Core搭建分布式音频效果处理服务(一)需求、问题和解决方案的几个坑
-
使用.NET Core搭建分布式音频效果处理服务(二)创建基于FFMpeg的Web程序
-
使用.NET Core搭建分布式音频效果处理服务(五)利用消息队列提升水平扩展灵活性
-
使用.NET Core搭建分布式音频效果处理服务(七)使用Docker压榨性能极限
-
使用.NET Core搭建分布式音频效果处理服务(目录)
-
使用.NET Core搭建分布式音频效果处理服务(二)创建基于FFMpeg的Web程序