当前位置: 移动技术网 > IT编程>开发语言>.net > 使用.NET Core搭建分布式音频效果处理服务(六)让MIddleware自动Invoke

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

2018年08月19日  | 移动技术网IT编程  | 我要评论

aymoy,台湾神仙膏,阿布都克尤木·库尔班

 

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

当然也可以使用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                 }

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

 

感谢阅读

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网