Я испытываю трудности с концепцией «сервисных локаторов» на основе строк.
Начнем с того, что IoC великолепен, и программирование интерфейсов - это путь. Но я не вижу, в чем заключается большое преимущество шаблона желтых страниц, используемого здесь, , за исключением возможности реконфигурирования без компиляции .
Код приложения будет использовать контейнер (Spring) для извлечения объектов из. Теперь это хорошо: поскольку код должен знать только необходимый интерфейс (для приведения к нему), интерфейс контейнера Spring и имя нужного объекта, большая часть связи удалена.
public void foo(){
((MyInterface) locator.get("the/object/I/need")).callMe();
}
Где, конечно, локатор может быть заполнен газиллионом объектов всех видов Object
производных.
Но я немного озадачен тем фактом, что «гибкость» извлечения объекта по имени на самом деле скрывает зависимость в небезопасном, небезопасном для поиска виде : где мой компилятор раньше проверял наличие запрошенного члена объекта и его тип, теперь все это откладывается до фазы выполнения.
Самым простым, функционально приемлемым шаблоном, который я мог придумать, является гигантский объект широкого применения struct
как:
public class YellowPages {
public MyInterface the_object_i_need;
public YourInterface the_object_you_need;
....
}
// context population (no xml... is that bad?)
YellowPages locator = new YellowPages();
locator.the_object_i_need=new MyImpl("xyx",true),
locator.the_object_you_need=new YourImpl(1,2,3)
public void foo(){
locator.the_object_i_need.callMe(); // type-safe, lookup-safe
}
Будет ли способ / шаблон / framework попросить компилятор разрешить запрошенный объект и проверить, в порядке ли его тип? Существуют ли структуры DI, которые также делают это?
Большое спасибо