加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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);
...

但是,如果你真的想让事件自动注册,我想你可以简单地将容器导入装饰器并在那里进行绑定.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读