Robotlegs связывает зависимости, которые принадлежат базовому классу - PullRequest
0 голосов
/ 02 марта 2012

Я использую ноги робота, у меня есть куча ServiceResponses, которые расширяют базовый класс и зависят от Parser, IParser. Мне нужно подключить парсер, специфичный для подкласса. Вот пример:

ModuleConfigResponse расширяет SimpleServiceResponse и реализует IServiceResponse.

Начальная часть легко подключается в контексте, вот пример:

injector.mapClass(IServiceResponse, ModuleConfigResponse);
injector.mapClass(IServiceResponse, SimpleServiceResponse, "roomconfig");
..etc

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

injector.mapValue(IParser, ModuleConfigParser, "moduleconfig");
injector.mapValue(IParser, RoomConfigParser, "roomconfig");

Вопрос в том, как связать их вместе. Базовый класс может иметь:

[Inject]
public var parser : IParser

Но я не могу определить тип заранее. Мне интересно, есть ли хороший способ связать это в контексте. На данный момент я решил связать это, создав вместо этого ответы в ResponseFactory, чтобы я мог передать парсер вручную в конструкторе.

injector.mapValue (IParser, ModuleConfigParser, "moduleconfig");

Ответы [ 2 ]

1 голос
/ 24 мая 2012

Я понял, что не все может быть отображено в контексте, Р.Л. заманил меня в ловушку этого мышления.Но я понял, что гораздо лучше отобразить фабрику для создания этих объектов, которые имеют очень специфические зависимости, чем поменять кодовую базу с интерфейсами маркеров или строками:)

0 голосов
/ 02 марта 2012

одно решение состоит в том, чтобы в вашем базовом классе было следующее:

protected var _parser : IParser

Тогда, например, в ModuleConfigResponse

[Inject(name='moduleconfig')]
public function set parser( value : IParser ) : void{
    _parser = value;
}

Но TBH, использование именованных инъекций настоятельно не рекомендуется, вы можететакже используйте интерфейс маркера:

public interface IModuleConfigParser extends IParser{}

базовый класс остается прежним, но ModuleConfigResponse будет тогда использовать:

[Inject]
public function set parser( value : IModuleConfigParser ) : void{
    _parser = value;
}
...