func ControllerInjectSingleton(controller Controller, router Router) error {
pType := reflect.TypeOf(controller)
iType := pType.Elem()
cname := iType.Name()
cpkg := iType.PkgPath()
switch {
case router.GetParam("controllergroup") != "":
group := router.GetParam("controllergroup")
router = router.SetParam("controllergroup", "").Group("/" + group)
case strings.HasSuffix(cname, "Controller"):
router = router.Group("/" + strings.ToLower(strings.TrimSuffix(cname, "Controller")))
case strings.HasSuffix(cname, "controller"):
router = router.Group("/" + strings.ToLower(strings.TrimSuffix(cname, "controller")))
default:
router = router.Group("")
}
enableextend := router.GetParam("enable-route-extend") != ""
router.SetParam("enable-route-extend", "")
var fnInit, fnRelease HandlerFunc
if enableextend {
fnInit = newControllerSingletionInit(controller, fmt.Sprintf("%s.%s.Init", cpkg, cname))
fnRelease = newControllerSingletionRelease(controller, fmt.Sprintf("%s.%s.Release", cpkg, cname))
}
pfn := defaultRouteParam
v, ok := controller.(controllerRouteParam)
if ok {
pfn = v.GetRouteParam
}
pool := NewControllerPoolSingleton(controller)
for method, path := range getRoutesWithName(controller) {
m, ok := pType.MethodByName(method)
if !ok || path == "" {
continue
}
if enableextend {
h := reflect.ValueOf(controller).Method(m.Index)
SetHandlerAliasName(h, fmt.Sprintf("%s.%s.%s", cpkg, cname, method))
router.AddHandler(getRouteMethod(method), path+" "+pfn(cpkg, cname, method), fnInit, h.Interface(), fnRelease)
} else {
router.AddHandler(getRouteMethod(method), path+" "+pfn(cpkg, cname, method), ControllerFuncExtend{
Controller: controller,
Name: fmt.Sprintf("%s.%s.%s", cpkg, cname, method),
Index: m.Index,
Pool: pool,
})
}
}
return nil
}