InversifyJS icon indicating copy to clipboard operation
InversifyJS copied to clipboard

Explore possibility of support for setter injection

Open remojansen opened this issue 7 years ago • 2 comments

Suggested by @akosyakov in the chat:

class Foo {

    @inject(Bar)
    set bar(bar: Bar) {
        this.bar.onChanged(() => this.update());
    }

}

I understood that i can do it via onActivation, but would be nice just annotate a setter with Inject

The onActivation comments refers to:

import { injectable, inject, Container } from "inversify";

@injectable()
class Katana {
    public name = "Katana";
}

@injectable()
class Shuriken {
    public name = "Shuriken";
}

@injectable()
class Ninja {
    public katana: Katana;
    public shuriken: Shuriken;

    public constructor(
        @inject("katana") katana: Katana
    ) {
        this.katana = katana;
    }
}

const container = new Container();

container.bind<Katana>("Katana").to(Katana);
container.bind<Shuriken>("Shuriken").to(Shuriken);

container.bind<Ninja>("Ninja").to(Ninja).onActivation((context, ninjaInstance) => {
    // All constructor injections took place already
    // we can inject some properties now
    const shuriken = context.container.get<Shuriken>("Shuriken");
    ninjaInstance.shuriken = shuriken;
    return ninjaInstance;
});

remojansen avatar Jun 08 '17 13:06 remojansen

It would be also nice to support method injections:

export class Foo {
     setBar(@inject(Bar) bar: Bar) {}
     activate(@inject(Bar) bar: Bar, @inject(Baz) baz: Baz) {}
}

akosyakov avatar Jun 18 '17 20:06 akosyakov

@remojansen @akosyakov Setter injection merged.

tonyhallett avatar Mar 30 '21 19:03 tonyhallett