typescript – 收集修饰的类(没有注册表类)
发布时间:2020-12-14 04:13:04 所属栏目:Windows 来源:网络整理
导读:我有一个事件调度程序类,它应该在某些事件中触发侦听器.我想通过装饰器注册事件监听器 – 这已经有效,但我对目前的解决方案并不是100%满意. 目前,事件监听器由全局注册表“收集”,然后在事件调度程序中注册.在代码中说我的(简化)装饰器看起来像: // Decora
我有一个事件调度程序类,它应该在某些事件中触发侦听器.我想通过装饰器注册事件监听器 – 这已经有效,但我对目前的解决方案并不是100%满意.
目前,事件监听器由全局注册表“收集”,然后在事件调度程序中注册.在代码中说我的(简化)装饰器看起来像: // Decorator export const EventListener = (events: string[]) => { return (target: Type<object>): void => { EventListenerRegistry.set(target); }; }; // Listener example @EventListener(['start']) class OnStart { public handle() { } } 一旦调度start事件,就会触发OnStart侦听器. 我不喜欢这种方法是需要EventListenerRegistry,它看起来像: export const EventListenerRegistry = (new class { protected listeners = []; public set(target) { this.listeners.push(target); } }); 导入EventListenerRegistry意味着在任何时候导入相同的实例,使其非常“单身”. 我的听众需要通过glob – 所以这种方法可以自动将我的听众注册给我的调度员而无需做任何额外的工作. 但除了使用(丑陋)注册表类之外还有其他可能性吗?
我会使用IoC容器. TypeScript的一个不错的是
Inversify.
这将允许这样的事情: import { injectable,inject } from 'inversify'; enum EventType { Start,} interface IEvent { type: Event; handle(): void; } @injectable() class OnStart implements IEvent { public readonly type = EventType.Start; public handle() { } } @injectable() class Application { public constructor(@multiInject(EVENT) public events: IEvent[]) { } } 但这确实意味着你必须自己做绑定: export const EVENT = symbol('event'); container.bind<IEvent>(EVENT).to(OnStart); ... 但是,如果你真的想让事件自动注册,我想你可以简单地将容器导入装饰器并在那里进行绑定. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- win10远程桌面工具简单使用方法
- .net – 加载Azure Storage 2.0时出错 – 无法加载Microsof
- wpf – 使用Microsoft(或其他)功能区与大型项目和MVVM
- Windows下Redis的安装与使用
- windows-server-2008 – 在Active Directory中禁用密码复杂
- 为Microsoft的Luis编写F#类型提供程序的好方法是什么?
- 在Windows上使用curl / curl.h
- 如何从中心位置更新.net Windows服务
- windows – 你应该在捕获图像之前进行碎片整理吗?
- Celery ValueError: not enough values to unpack (expecte