Как я могу внедрить один и тот же объект через разные интерфейсы?

Можно ли с помощью Robotlegs 2.0 объявить синглтон в контексте и внедрить его в несколько классов, где каждая инъекция запрашивает другой интерфейс?

Класс для внедрения:

 class MyClass implements IFoo, IBar {}

Место инъекции 1:

 class NeedFoo {
    [Inject]
    public var foo:IFoo;
 } 

Место инъекции 2:

 class NeedBar {
    [Inject]
    public var bar:IBar;
 } 

Я хочу, чтобы обе инъекции были для одного и того же экземпляра, но если я создам два сопоставления, то каждый получит свой собственный экземпляр:

 injector.map( IFoo ).toSingleton( MyClass );
 injector.map( IBar ).toSingleton( MyClass );

Итак, я сделал это:

 var instance:MyClass = new MyClass();
 injector.map( IFoo ).toValue( instance );
 injector.map( IBar ).toValue( instance );

Есть ли способ просто сказать, что этот объект должен быть предоставлен для любого интерфейса, который он реализует, а не индивидуально для каждого?


person Peter Hall    schedule 16.07.2013    source источник


Ответы (1)


Да, это так, но это немного запутанный и действительно непонятный банкомат. В будущем мы добавим для него некоторый синтаксический сахар, но пока вы можете сделать это:

injector.map( IFoo ).toSingleton( MyClass );
var provider: DependencyProvider = injector.getMapping( IFoo ).getProvider();
injector.map( IBar ).toProvider( provider );

or

var provider: DependencyProvider = injector.map( IFoo ).toSingleton( MyClass ).getProvider();
injector.map( IBar ).toProvider( provider );
person Creynders    schedule 17.07.2013
comment
Да, можно было бы добавить немного сахара... но он делает свою работу! Спасибо. - person Peter Hall; 17.07.2013
comment
Есть ли где-нибудь тикет в баг-трекере? - person Peter Hall; 17.07.2013