Почему приложение afBedSheet выдает "Сервис не существует для Типа afBedSheet::Routes"
Используя пример из документации afBedSheet:
using afIoc
using afBedSheet
class HelloPage {
Text hello(Str name, Int iq := 666) {
return Text.fromPlain("Hello! I'm $name and I have an IQ of $iq!")
}
}
class AppModule {
@Contribute { serviceType=Routes# }
static Void contributeRoutes(Configuration conf) {
conf.add(Route(`/index`, Text.fromPlain("Welcome to BedSheet!")))
conf.add(Route(`/hello/**`, HelloPage#hello))
}
}
class Example {
Int main() {
return afBedSheet::Main().main([AppModule#.qname, "8080"])
}
}
Если я добавлю эту строку в качестве первой строки метода main() в классе Example
registry := IocService([AppModule#]).start.registry
Приложение afBedSheet не запускается и выдает:
[21:40:10 11-Aug-14] [info] [afIoc] Adding module definition for Example_0::AppModule
[21:40:10 11-Aug-14] [info] [afIoc] Starting IOC...
[21:40:10 11-Aug-14] [err] [afIoc] Err starting IOC
afIoc::IocErr: Service does not exist for Type 'afBedSheet::Routes' defined in contribution method Example_0::AppModule.contributeRoutes.
Ioc Operation Trace:
[ 1] Building IoC Registry
[ 2] Validating contribution definitions
Stack Trace:
afIoc::Utils.stackTraceFilter (Utils.fan:45)
afIoc::RegistryBuilder.build (RegistryBuilder.fan:108)
afIoc::IocService.onStart (IocService.fan:76)
fan.sys.Service$.start (Service$.java:206)
afIoc::IocService.start (IocService.fan:10)
Example_0::Example.main (/Users/coder/Documents/temp/testBedSheet/Example.fan:20)
java.lang.reflect.Method.invoke (Method.java:483)
fan.sys.Method.invoke (Method.java:559)
fan.sys.Method$MethodFunc.callOn (Method.java:230)
fan.sys.Method.callOn (Method.java:139)
fanx.tools.Fan.callMain (Fan.java:175)
fanx.tools.Fan.executeFile (Fan.java:98)
fanx.tools.Fan.execute (Fan.java:37)
fanx.tools.Fan.run (Fan.java:298)
fanx.tools.Fan.main (Fan.java:336)
ERROR: fan.afIoc.IocService.onStart
Как я могу получить доступ к IocService приложения afBedSheet для получения связанных служб?
1 ответ
Решение
Нет необходимости создавать свой собственный реестр IoC, поскольку простыня создает его для вас.
Кроме того, не должно быть необходимости доступа к реестру за пределами веб-приложения.
Если вам нужно, чтобы что-то произошло при запуске веб-приложения, добавьте функцию / закрытие в RegistryStartup:
class AppModule {
@Contribute { serviceType=RegistryStartup# }
static Void contributeRegistryStartup(Configuration conf, MyService myService) {
conf.add |->| {
myService.soSomething()
}
}
}
Чтобы получить доступ во время веб-запроса, @Inject
услуги в ваши обработчики:
class HelloPage {
@Inject MyService? myService
Text hello(Str name, Int iq := 666) {
myService.doSomething()
return Text.fromPlain("Hello! I'm $name and I have an IQ of $iq!")
}
}