Каковы критерии выбора между IocService и RegistryBuilder в Fantom afIoc?
Документация IoC-инфраструктуры Alien Factory для Fantom гласит:
Вы можете использовать IocService для запуска IoC как сервиса Fantom:
IocService([MyModule#]).start
...
reg := ((IocService) Service.find(IocService#)).registry
service := reg.dependencyByType(MyService#)
...
Service.find(IocService#).uninstall
Или используйте RegistryBuilder для управления экземпляром реестра вручную;
reg := RegistryBuilder().addModule(MyModule#).build.startup
...
service := reg.dependencyByType(MyService#)
...
reg.shutdown
Но каковы критерии для выбора подходящего способа инициализации реестра по конкретному сценарию?
1 ответ
Краткий ответ - используйте RegistryBuilder
,
Длинный ответ побудил меня обновить документацию... это продолжается, но вот текущая версия:
Построение реестра
использование RegistryBuilder
вручную управлять IoC Registry
пример. Обычно вы делаете это при запуске тестов.
registry := RegistryBuilder().addModule(MyModule#).build().startup()
...
service := registry.dependencyByType(MyService#)
...
registry.shutdown()
Убедитесь, что модули добавлены из других библиотек IoC, которые использует код. Например, если вы используете библиотеку IocEnv, добавьте IocEnvModule
:
registry := RegistryBuilder().addModule(MyModule#).addModule(IocEnvModule#).build().startup()
Стандартно, что модули библиотеки IoC названы в честь библиотеки, но с Module
суффикс.
IocService
Если ваш код выполняется в контейнере IoC, таком как простыня, то контейнер управляет Registry
экземпляр для вас.
Если вы запускаете юнит-тесты, то обычно вы создаете свой собственный Registry
экземпляр и удерживайте его как переменную / поле.
Альтернативой является создание сервиса Fantom для хранения реестра. Это полезно в ситуациях, когда статический доступ к Registry
, такие как fwt
приложения, где у вас очень мало контроля над тем, как создаются ваши классы.
IocService
является вспомогательным классом, который расширяет "Сервис" и содержит удобные методы для создания и доступа к реестру.
Например, чтобы создать и запустить Сервис Fantom IoC:
IocService([MyModule#]).start()
Затем из любого места в вашем коде к нему можно получить доступ:
iocService := (IocService) Service.find(IocService#)
...
myService := iocService.serviceById(MyService#.qname)
Удалить IocService
как и любой другой:
Service.find(IocService#).uninstall()