1. package main
    2. import (
    3. WebApplication "github.com/yoyofx/yoyogo/web"
    4. ......
    5. )
    6. func main() {
    7. webHost := CreateCustomBuilder().Build()
    8. webHost.Run()
    9. }
    10. // 自定义HostBuilder并支持 MVC 和 自动参数绑定功能,简单情况也可以直接使用CreateDefaultBuilder 。
    11. func CreateCustomBuilder() *abstractions.HostBuilder {
    12. configuration := abstractions.NewConfigurationBuilder().
    13. AddEnvironment().
    14. AddYamlFile("config").Build()
    15. return WebApplication.NewWebHostBuilder().
    16. UseConfiguration(configuration).
    17. Configure(func(app *WebApplication.WebApplicationBuilder) {
    18. app.UseMiddleware(middlewares.NewCORS())
    19. //WebApplication.UseMiddleware(middlewares.NewRequestTracker())
    20. app.UseStaticAssets()
    21. app.UseEndpoints(registerEndpointRouterConfig)
    22. app.UseMvc(func(builder *mvc.ControllerBuilder) {
    23. //builder.AddViews(&view.Option{Path: "./Static/templates"})
    24. builder.AddViewsByConfig()
    25. builder.AddController(contollers.NewUserController)
    26. builder.AddFilter("/v1/user/info", &contollers.TestActionFilter{})
    27. })
    28. }).
    29. ConfigureServices(func(serviceCollection *dependencyinjection.ServiceCollection) {
    30. serviceCollection.AddTransientByImplements(models.NewUserAction, new(models.IUserAction))
    31. serviceCollection.AddSingletonByImplementsAndName("db1", datasources.NewMysqlDataSource, new(abstractions.IDataSource))
    32. serviceCollection.AddSingletonByImplementsAndName("redis1", datasources.NewRedis, new(abstractions.IDataSource))
    33. //eureka.UseServiceDiscovery(serviceCollection)
    34. //consul.UseServiceDiscovery(serviceCollection)
    35. nacos.UseServiceDiscovery(serviceCollection)
    36. }).
    37. OnApplicationLifeEvent(getApplicationLifeEvent)
    38. }
    39. //region endpoint 路由绑定函数
    40. func registerEndpoints(rb router.IRouterBuilder) {
    41. Endpoints.UseHealth(rb)
    42. Endpoints.UseViz(rb)
    43. Endpoints.UsePrometheus(rb)
    44. Endpoints.UsePprof(rb)
    45. Endpoints.UseJwt(rb)
    46. rb.GET("/error", func(ctx *context.HttpContext) {
    47. panic("http get error")
    48. })
    49. //POST 请求: /info/:id ?q1=abc&username=123
    50. rb.POST("/info/:id", func(ctx *context.HttpContext) {
    51. qs_q1 := ctx.Query("q1")
    52. pd_name := ctx.Param("username")
    53. userInfo := &UserInfo{}
    54. _ = ctx.Bind(userInfo) // 手动绑定请求对象
    55. strResult := fmt.Sprintf("Name:%s , Q1:%s , bind: %s", pd_name, qs_q1, userInfo)
    56. ctx.JSON(200, context.H{"info": "hello world", "result": strResult})
    57. })
    58. // 路由组功能实现绑定 GET 请求: /v1/api/info
    59. rb.Group("/v1/api", func(router *router.RouterGroup) {
    60. router.GET("/info", func(ctx *context.HttpContext) {
    61. ctx.JSON(200, context.H{"info": "ok"})
    62. })
    63. })
    64. // GET 请求: HttpContext.RequiredServices获取IOC对象
    65. rb.GET("/ioc", func(ctx *context.HttpContext) {
    66. var userAction models.IUserAction
    67. _ = ctx.RequiredServices.GetService(&userAction)
    68. ctx.JSON(200, context.H{"info": "ok " + userAction.Login("zhang")})
    69. })
    70. }
    71. //endregion
    72. //region 请求对象
    73. type UserInfo struct {
    74. UserName string `param:"username"`
    75. Number string `param:"q1"`
    76. Id string `param:"id"`
    77. }
    78. // ----------------------------------------- MVC 定义 ------------------------------------------------------
    79. // 定义Controller
    80. type UserController struct {
    81. *mvc.ApiController
    82. userAction models.IUserAction // IOC 对象参数
    83. }
    84. // 构造器依赖注入
    85. func NewUserController(userAction models.IUserAction) *UserController {
    86. return &UserController{userAction: userAction}
    87. }
    88. // 请求对象的参数化绑定
    89. type RegiserRequest struct {
    90. mvc.RequestBody
    91. UserName string `param:"username"`
    92. Password string `param:"password"`
    93. }
    94. // Register函数自动绑定参数
    95. func (this *UserController) Register(ctx *context.HttpContext, request *RegiserRequest) actionresult.IActionResult {
    96. result := mvc.ApiResult{Success: true, Message: "ok", Data: request}
    97. return actionresult.Json{Data: result}
    98. }
    99. // use userAction interface by ioc
    100. func (this *UserController) GetInfo() mvc.ApiResult {
    101. return this.OK(this.userAction.Login("zhang"))
    102. }
    103. // Web程序的开始与停止事件
    104. func fireApplicationLifeEvent(life *abstractions.ApplicationLife) {
    105. printDataEvent := func(event abstractions.ApplicationEvent) {
    106. fmt.Printf("[yoyogo] Topic: %s; Event: %v\n", event.Topic, event.Data)
    107. }
    108. for {
    109. select {
    110. case ev := <-life.ApplicationStarted:
    111. go printDataEvent(ev)
    112. case ev := <-life.ApplicationStopped:
    113. go printDataEvent(ev)
    114. break
    115. }
    116. }
    117. }