一、概述
本文简述在 WPF
中绘制功率谱(Power Spectrum)。会将功率谱密度(PSD,Power spectral density)单位转换为分贝(dB, Decibel), 实现类似于 Adobe Audition 软件中频谱分析的功能。为简单起见及本人需要,FFT 数量使用 2048
,窗口函数使用汉宁窗(Hanning)。
本文简述在 WPF
中绘制功率谱(Power Spectrum)。会将功率谱密度(PSD,Power spectral density)单位转换为分贝(dB, Decibel), 实现类似于 Adobe Audition 软件中频谱分析的功能。为简单起见及本人需要,FFT 数量使用 2048
,窗口函数使用汉宁窗(Hanning)。
(图片来源:李超)
mediasoup
的服务端由两部分构成:
1、使用 C++
编写的作为子进程的媒体层 (ICE
, DTLS
, RTP
等)。可执行文件在 Linux
或 macOS
上为 mediasoup-worker
,在 Windows
上为 mediasoup-worker.exe
。
2、使用 Javascript
(Typescript
) 编写的、基于 Node.js
的用于与 mediasoup-worker 进行通信的组件。因为官方或几乎所有第三方的 mediasoup 服务端都是使用的是 Node.js 来实现,所以官方提供一个中间层让开发者不直接和 mediassoup-workder 交互。
本文主要讨论如何使用 ASP.NET Core
替换 Javascript(Node.js) 的实现。
(备注:由于是在参考图基础上 PS 的,不太准确,有心情了再改吧。)
工作单元是”对象-关系”行为的一种模式。维护受业务事务影响的对象列表,并协调变化的写入和并发问题的解决。——《企业应用架构模式》
工作单元只是将所有修改状态保存下来,在适当的时候在同一数据库连接和事务处理上下文中一次性将对象的变更提交到数据中。额外的优点是既减少了数据库调用次数,又避免数据库长事务。
同一个工作单元一般不要跨线程使用。
工作单元常与仓储(Repository)模式一起使用。因为多个 Repository
可能做出多处更改,如果在 Repository 中调用 DbContext.SaveChanges
或 DbContext.SaveChangesAsync
(如果使用 Entity Framework
的话),则产生了多个相互隔离开的事务。
实际上
Entity Framewok
也实现了仓储模式(DbSet<T>
)和工作单元模式(DbContext)。
直接使用工作单元也是可以的。配合依赖注入和拦截器能将工作单元的创建和完成提交的工作自动化,也就是说避免了手工创建工作单元和手工调用 Complete/Commit 。这种自动化使得应对复杂业务逻辑时不用过于关注业务无关的事务安全问题。
去年写过一篇《ASP.NET Core 授权的扩展:自定义 Authorize Attribute 和 IApplicationModelProvide》,由于在 ASP.NET Core
3 中,Microsoft.AspNetCore.Mvc.Internal
命名空间下的 AuthorizationApplicationModelProvider
类由 public
被改为了 internal
,使得无法方便地将其从容器中 DI
容器中移除,所以不得不回到 IAuthorizationPolicyProvider
上来。
ASP.NET Core
提供了基于角色( Role
)、声明( Chaim
) 和策略 ( Policy
) 等的授权方式。在实际应用中,可能采用部门( Department
, 本文采用用户组 Group
)、职位 ( 可继续沿用 Role
)、权限( Permission
)的方式进行授权。本文通过自定义 IAuthorizationPolicyProvider
进行扩展。