Как сообщить контейнеру внедрения зависимостей для совместного использования экземпляра? - PullRequest
0 голосов
/ 09 июля 2020

Я изучаю DI с помощью Typescript (в примере я использую пакет tsyringe).

Как я могу указать контейнеру DI, который мне нужен:

  • один новый экземпляр Bar для каждого экземпляра FooBar (поэтому нет синглтона) и
  • Foo должен ссылаться на экземпляр Bar FooBar?

В приведенном ниже примере tsyringe создает два экземпляра Bar (один в Foo и один для FooBar).

it("injects one Bar instance", () => {

  @injectable()
  class Bar {
    constructor() {}
    x = 1;
  }

  @injectable()
  class Foo {
    constructor(public myBar: Bar) {}
  }

  @injectable()
  class FooBar {
    constructor(public bar: Bar, public foo: Foo) {}
  }

  const fooBar = container.resolve(FooBar);
  fooBar.bar.x = 2;
  expect(fooBar.foo.myBar).toBe(2); // throws error (is 1)
});

1 Ответ

0 голосов
/ 10 июля 2020

Для tsyringe необходимо использовать декоратор @scoped:

  @scoped(Lifecycle.ResolutionScoped)
  class Bar {
    constructor() {}
  }
...