激活句柄

给一个类型添加一个激活句柄是可能的。激活句柄在依赖被找到后、但是还没有被添加到缓存(如果是单例的话)并注入之前被调用。 这非常有用,因为这样可以让我们的依赖不必关注横切面(比如缓存、日志等)的具体实现。 下面的例子使用了代理截获了某个依赖(Katana)的方法(use)。

interface Katana {
  use: () => void;
}

@injectable()
class Katana implements Katana {
  public use() {
    console.log("Used Katana!");
  }
}

interface Ninja {
  katana: Katana;
}

@injectable()
class Ninja implements Ninja {
  public katana: Katana;
  public constructor(@inject("Katana") katana: Katana) {
    this.katana = katana;
  }
}
container.bind<Ninja>("Ninja").to(Ninja);

container
  .bind<Katana>("Katana")
  .to(Katana)
  .onActivation((context, katana) => {
    let handler = {
      apply: function (target, thisArgument, argumentsList) {
        console.log(`Starting: ${new Date().getTime()}`);
        let result = target.apply(thisArgument, argumentsList);
        console.log(`Finished: ${new Date().getTime()}`);
        return result;
      },
    };
    katana.use = new Proxy(katana.use, handler);
    return katana;
  });
let ninja = container.get<Ninja>();
ninja.katana.use();
> Starting: 1457895135761
> Used Katana!
> Finished: 1457895135762

results matching ""

    No results matching ""