2012-03-02 4 views
0

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

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

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

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

Каждый ответ использует анализатор, который используется в BaseClass:

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

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

[Inject] 
public var parser : IParser 

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

инжектор.mapValue (IParser, ModuleConfigParser, "moduleconfig");

ответ

1

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

0

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

protected var _parser : IParser 

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

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

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

public interface IModuleConfigParser extends IParser{} 

базовый класс остается неизменным, но M oduleConfigResponse затем использовать:

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

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

+0

Да, они определенно не идеальны, но у них есть преимущество проверки типа CT. Но TBH я никогда не сталкивался с ситуацией, описанной выше, вероятно, из-за другого стиля кодирования/дизайна, поэтому я просто дал ответ, чтобы решить вопрос как есть. – Creynders

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

  • Нет связанных вопросов^_^