2012-06-20 2 views
2

мне нужно решить странную задачу: У меня есть класс А, который создается с помощью Guice:Использовать ранее вводили привязки при инициализации Guice

bind(A.class) 

но потом мне нужно инициализировать Actor с классом А (что актер по своей природе):

actorSystem.actorOf(
    new Props(
    new UntypedActorFactory() { 
     public UntypedActor create() { 
     /// ???? 
     } 
    }) 
); 

Как вернуть экземпляр ранее связанного актера A?

+0

Я думаю, что ваш вопрос непонятен, не могли бы вы уточнить, пожалуйста? Кроме того, важно ли вы, чтобы вы использовали Actor/Akka? Имеет ли связь с проблемой? – Yanflea

+0

Я думаю, что это не связано строго с аккой. Представьте себе, что класс A имеет конструктор, подобный этому «public A (B instanceB, C instanceC) {}», и есть экземпляры B и C, созданные где-то в Guice. И мне нужно получить ссылку на экземпляр A после его создания, чтобы что-то сделать (например, вызвать некоторые методы или зарегистрировать его в каком-то реестре). Я решил это с созданием дополнительного класса BootStrap, который принимает параметр A как его собственный конструктор, а внутри конструктора он делает что-то полезное. Но, похоже, это хромое решение. – jdevelop

+0

Извините ... все еще запутанно. Может больше :). Думал, что это я, но, похоже, никто не может ответить вам только этими небольшими сведениями. Пожалуйста, отредактируйте свой вопрос и дайте реальный пример того, чего вы хотите достичь, и того, что вы пробовали до сих пор. Я думаю (думаю, что), что ваша проблема может быть просто решена с помощью механизма Guice Provider или Assisted Injection (у вас есть на это взгляд?), Но поскольку я до сих пор не понимаю ваши объяснения на 100%, сложно дать ответ. – Yanflea

ответ

2

Возможно, я ошибаюсь в вопросе, который подразумевается в ????, но когда вы используете Guice, вы, как правило, пытаетесь избежать появления новых объектов. Когда вам нужен новый объект, управляемый Guice, вы просто просите поставщика этого типа. Даже если вы не создали для него поставщика, существует неявный провайдер, в котором Guice либо перенаправляет объект на область, к которой он привязан, либо дает вам новую версию с инжектированными объектами, которые ей нужны.

Это может выглядеть примерно так:

class WhateverClassThisIs { 
    private provider<A> providesA; 

    @Inject 
    public WhateverClassThisIs(provider<A> providesA) { 
    this.providesA = providesA; 
    } 

    public whateverMethodThisIs() { 
    actorSystem.actorOf(
    new Props(
     new UntypedActorFactory() { 
     public UntypedActor create() { 
      /// ???? translation: I need an object A here. 
      A a = providesA.get(); 
     } 
     }) 
    ); 
    } 
} 

Если вы можете редактировать другие типы классов, вы можете вместо этого вводить объекты их конструкторы/методы необходимы, исключая несколько видов нового.

Если с другой стороны вы говорили, что для получения нужного типа A вам нужно позвонить actorSystem.actorOf, тогда вам необходимо реализовать провайдера для A, который делает это вместо того, чтобы просто привязывать его.

Смежные вопросы