您现在的位置是:首页 > 文章详情

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

日期:2018-08-17点击:444

 

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

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

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

 

感谢阅读

原文链接:https://yq.aliyun.com/articles/665183
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章