mvc

package
v0.0.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 20, 2026 License: MIT Imports: 11 Imported by: 0

README

web/mvc 包 — MVC 控制器与 Web 启动器

所属层级: Infrastructure Layer
设计理念: 接口抽象,插件化架构

概述

web/mvc 包位于 Infrastructure Layer,提供 Web MVC 框架的抽象接口定义,允许用户切换不同的网络框架实现。合并了原 mvc 包的所有功能。

核心功能
功能 说明
MVC 控制器 Controller 接口,路由注册
注解路由 @RestController、@GetMapping 等注解,自动扫描注册
WebStarter 启动器集成,自动注册控制器
中间件 日志、恢复、CORS 等中间件支持
WebSocket WebSocket 服务器和连接接口

架构设计

web/mvc/          ← 抽象层(接口定义)
├── context.go     ← Context 接口
├── router.go      ← Router 接口
├── server.go      ← Server 接口
├── controller.go  ← Controller 接口
├── websocket.go   ← WebSocket 接口
└── starter.go     ← WebStarter 启动器

web/server/       ← 实现层(使用原生 net/http)
├── DefaultContext  ← 实现 mvc.Context
├── DefaultRouter   ← 实现 mvc.Router
├── httpServer      ← 实现 mvc.Server
└── 中间件实现

核心接口

Context

HTTP 请求上下文接口,封装请求和响应操作:

type Context interface {
    RequestMethod() string
    RequestURI() string
    PathParam(name string) string
    Query(name string) string
    QueryDefault(name, defaultVal string) string
    Header(key string) string
    BindJSON(target any) error
    SetStatusCode(code int)
    SetHeader(key, value string)
    JSON(code int, data any) error
    String(code int, format string, args ...any)
    AbortWithStatus(code int)
    AbortWithStatusJSON(code int, body any)
    Next()
    IsAborted() bool
    Context() context.Context
    SetContext(ctx context.Context)
}
Router

路由器接口,提供路由注册功能:

type Router interface {
    GET(path string, handler HandlerFunc)
    POST(path string, handler HandlerFunc)
    PUT(path string, handler HandlerFunc)
    DELETE(path string, handler HandlerFunc)
    PATCH(path string, handler HandlerFunc)
    Group(prefix string) Router
    Use(middleware MiddlewareFunc)
}
Controller

控制器接口,通过实现此接口注册路由:

type Controller interface {
    Routes(router Router)
}
Server

HTTP 服务器接口,定义服务器生命周期:

type Server interface {
    Start() error
    Stop(ctx context.Context) error
    SetHandler(handler any)
    Use(middleware any)
}
WebSocket

WebSocket 服务器和连接接口:

type WebSocketServer interface {
    Start() error
    Stop(ctx context.Context) error
    SetHandler(handler WebSocketHandler)
}

type WebSocketConnection interface {
    ReadMessage() (messageType int, message []byte, err error)
    WriteMessage(messageType int, message []byte) error
    Close() error
}

使用示例

定义控制器
type UserController struct {
    Service *UserService
}

func (c *UserController) Routes(router mvc.Router) {
    router.GET("/users/{id}", c.GetUser)
    router.POST("/users", c.CreateUser)
}

func (c *UserController) GetUser(ctx mvc.Context) {
    id := ctx.PathParam("id")
    ctx.JSON(http.StatusOK, map[string]string{"id": id})
}

func init() {
    mvc.RegisterController(&UserController{})
}
创建 Web Starter
// 创建路由器和服务器
router := server.NewRouter()
httpServer := server.NewHTTPServer(
    server.WithHost(":8080"),
    server.WithReadTimeout(30*time.Second),
)

// 创建 WebStarter
starter := mvc.NewWebStarter(
    mvc.WithConfig(mvc.DefaultConfig()),
    mvc.WithRouter(router),
    mvc.WithServer(httpServer),
    mvc.WithMiddlewares([]core.MiddlewareFunc{
        server.LoggingMiddleware(),
        server.RecoveryMiddleware(),
    }),
)

// 注册到全局注册表
boot.RegisterStarter(starter)

设计原则

  • 接口抽象:所有核心组件都定义为接口,易于替换实现
  • 零外部依赖:仅使用 Go 标准库
  • 参考 Spring MVC:借鉴 Spring MVC 的设计理念
  • 可扩展:支持自定义路由器、服务器和中间件

注解路由

注解路由参考 Spring Boot 的 @RestController / @GetMapping 等注解,支持自动扫描和路由注册。

注解类型
注解 说明 使用方式
@RestController 声明 REST 控制器 嵌入结构体,设置 base-path
@GetMapping GET 方法映射 方法注释中添加 @GetMapping(path=/path)
@PostMapping POST 方法映射 方法注释中添加 @PostMapping(path=/path)
@PutMapping PUT 方法映射 方法注释中添加 @PutMapping(path=/path)
@DeleteMapping DELETE 方法映射 方法注释中添加 @DeleteMapping(path=/path)
@PatchMapping PATCH 方法映射 方法注释中添加 @PatchMapping(path=/path)
@RequestMapping 通用请求映射 方法注释中添加 @RequestMapping(path=/path)
使用示例
type UserController struct {
    web.RestController `route:"base-path=/api/users"`
}

// @GetMapping(path=/)
func (c *UserController) ListUsers(ctx context.Context) ([]*User, error) {
    return getUsers(), nil
}

// @GetMapping(path=/{id})
func (c *UserController) GetUser(ctx context.Context, id string) (*User, error) {
    return getUserByID(id), nil
}

// @PostMapping(path=/)
func (c *UserController) CreateUser(ctx context.Context, user *User) (*User, error) {
    return createUser(user), nil
}

// @DeleteMapping(path=/{id})
func (c *UserController) DeleteUser(ctx context.Context, id string) error {
    return deleteUser(id)
}
扫描和注册

使用 core.ComponentScanner 进行扫描:

// 创建容器
container := core.New()

// 设置 web 包的容器引用
web.SetContainer(container)

// 扫描组件(自动识别 @RestController 并注册路由)
scanner := core.NewComponentScanner("./internal", core.WithAutoInject(true))
scanner.Scan(container)

// 注册到标准 mux
mux := http.NewServeMux()
web.GlobalRouteRegistry.RegisterToMux(mux)

// 启动服务器
http.ListenAndServe(":8080", mux)
内容类型配置
type UserController struct {
    web.RestController `route:"base-path=/api/users"`
}

// @GetMapping(path=/, produces=application/json)
func (c *UserController) ListUsers(ctx context.Context) ([]*User, error) {
    return getUsers(), nil
}

// @PostMapping(path=/, consumes=application/json, produces=application/json)
func (c *UserController) CreateUser(ctx context.Context, user *User) (*User, error) {
    return createUser(user), nil
}
最佳实践
  1. 使用注解路由 - 代码更简洁,路由声明更直观
  2. base-path 统一前缀 - 同一控制器使用相同 base-path
  3. RESTful 风格 - 遵循 REST API 设计规范
  4. 内容类型声明 - 明确声明 consumes 和 produces

Documentation

Overview

Package mvc 提供 MVC 控制器支持。

Package mvc 提供 MVC 控制器支持。

Package mvc 提供 MVC 控制器支持。

该模块提供控制器注册、路由组、内容协商等 Web MVC 功能。 参考 Spring MVC 的设计理念,提供完整的 MVC 架构支持。

架构设计

  • Context: HTTP 请求上下文接口
  • Router: 路由器接口,负责路由注册和匹配
  • Controller: 控制器接口,处理 HTTP 请求
  • Server: HTTP 服务器接口
  • HandlerFunc: HTTP 处理函数
  • MiddlewareFunc: 中间件函数类型
  • WebSocketServer: WebSocket 服务器接口
  • MessageHandler: 消息处理器接口
  • WebSocketMiddleware: WebSocket 中间件接口
  • Connection: WebSocket 连接接口
  • Room: WebSocket 房间接口

核心功能

  • 控制器注册: 支持自动扫描和注册控制器
  • 路由组: 支持路由分组和前缀
  • 内容协商: 支持 JSON、XML、HTML 等多种响应格式
  • 视图渲染: 支持模板引擎渲染视图
  • 拦截器: 支持请求拦截和预处理

使用方式

定义控制器:

type UserController struct {
    mvc.RestController
}

// @GetMapping("/users/{id}")
func (c *UserController) GetUser(ctx *mvc.Context) {
    id := ctx.Param("id")
    user := c.userService.GetByID(id)
    ctx.JSON(user)
}

注册路由:

router := mvc.NewRouter()
router.Group("/api").
    AddController(&UserController{})

内容协商

支持根据 Accept 头自动协商响应格式:

  • application/json: JSON 响应
  • application/xml: XML 响应
  • text/html: HTML 响应

Package mvc 提供 MVC 控制器支持。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func ClearControllers

func ClearControllers()

ClearControllers 清除所有已注册的控制器(仅用于测试)。

func GetControllers

func GetControllers() []core.Controller

GetControllers 获取所有已注册的控制器。

func RegisterController

func RegisterController(ctrl core.Controller)

RegisterController 注册控制器到全局注册表。

控制器会在应用启动时自动被扫描并注册到路由器。 通常在 init() 函数中调用。

Types

type Config

type Config struct {
	Port    int
	Host    string
	Timeout time.Duration
	Logger  log.Logger
}

Config Web 服务器配置。

func DefaultConfig

func DefaultConfig() Config

DefaultConfig 返回默认 Web 配置。

type Connection

type Connection interface {
	ID() string
	Send(message []byte) error
	Close() error
	IsClosed() bool
	SetAttribute(key string, value any)
	GetAttribute(key string) (any, bool)
	Join(roomID string) error
	Leave(roomID string) error
	Rooms() []string
}

Connection WebSocket 连接接口。

type Context

type Context = core.Context

核心接口重新导出。

type Controller

type Controller = core.Controller

核心接口重新导出。

type HandlerFunc

type HandlerFunc = core.HandlerFunc

核心接口重新导出。

type MessageHandler

type MessageHandler interface {
	Handle(conn Connection, message []byte) error
}

MessageHandler 消息处理器接口。

type MiddlewareFunc

type MiddlewareFunc = core.MiddlewareFunc

核心接口重新导出。

type Room

type Room interface {
	ID() string
	Broadcast(message []byte) error
	Members() []Connection
}

Room WebSocket 房间接口。

type Router

type Router = core.Router

核心接口重新导出。

type Server

type Server = core.Server

核心接口重新导出。

type Stats

type Stats struct {
	TotalConnections  int
	ActiveConnections int
	RoomsCount        int
	MessagesSent      int64
	MessagesReceived  int64
	BytesSent         int64
	BytesReceived     int64
}

Stats WebSocket 服务器统计信息。

type WebConfig

type WebConfig = Config

WebConfig 配置别名(向后兼容)。

func DefaultWebConfig

func DefaultWebConfig() WebConfig

DefaultWebConfig 返回默认 Web 配置(向后兼容)。

type WebSocketMiddleware

type WebSocketMiddleware interface {
	Handle(conn Connection) error
}

WebSocketMiddleware WebSocket 中间件接口。

type WebSocketServer

type WebSocketServer interface {
	Start() error
	Stop(ctx context.Context) error
	HandleMessage(event string, handler MessageHandler)
	Use(middleware WebSocketMiddleware)
}

WebSocketServer WebSocket 服务器接口。

type WebStarter

type WebStarter struct {
	// contains filtered or unexported fields
}

WebStarter Web MVC 启动器

负责初始化 HTTP 服务器、注册控制器和中间件。 实现 boot.Starter 接口,在应用启动时自动执行。

func NewWebStarter

func NewWebStarter(opts ...WebStarterOption) *WebStarter

NewWebStarter 创建新的 Web 启动器

func (*WebStarter) AddMiddleware

func (s *WebStarter) AddMiddleware(middleware core.MiddlewareFunc)

AddMiddleware 添加中间件

func (*WebStarter) Configure

func (s *WebStarter) Configure(ctx boot.ApplicationContext) error

Configure 配置阶段调用

func (*WebStarter) Dependencies

func (s *WebStarter) Dependencies() []string

Dependencies 返回依赖的其他启动器名称

func (*WebStarter) GetCondition

func (s *WebStarter) GetCondition() condition.Condition

GetCondition 返回启动条件

func (*WebStarter) GetRouter

func (s *WebStarter) GetRouter() core.Router

GetRouter 获取路由器。

func (*WebStarter) Name

func (s *WebStarter) Name() string

Name 返回启动器名称

func (*WebStarter) SetHandler

func (s *WebStarter) SetHandler(handler http.Handler)

SetHandler 设置自定义处理器(如安全过滤器链) 如果设置了自定义处理器,Start() 将使用它而不是默认的 router

func (*WebStarter) SetMiddlewares

func (s *WebStarter) SetMiddlewares(middlewares []core.MiddlewareFunc)

SetMiddlewares 设置中间件列表

func (*WebStarter) SetRouter

func (s *WebStarter) SetRouter(router core.Router)

SetRouter 设置路由器(支持扩展,可替换为 gin/hertz 等)

func (*WebStarter) SetServer

func (s *WebStarter) SetServer(server core.Server)

SetServer 设置服务器(支持扩展,可替换为 gin/hertz 等)

func (*WebStarter) Start

func (s *WebStarter) Start(ctx boot.ApplicationContext) error

Start 启动阶段调用

func (*WebStarter) Stop

func (s *WebStarter) Stop(ctx boot.ApplicationContext) error

Stop 停止阶段调用

func (*WebStarter) Use

func (s *WebStarter) Use(middleware core.MiddlewareFunc) *WebStarter

Use 添加中间件。

func (*WebStarter) WithRouter

func (s *WebStarter) WithRouter(router core.Router) *WebStarter

WithRouter 设置路由器实现。

func (*WebStarter) WithServer

func (s *WebStarter) WithServer(server core.Server) *WebStarter

WithServer 设置 HTTP 服务器实现。

type WebStarterOption

type WebStarterOption func(*WebStarter)

WebStarterOption 是 WebStarter 配置选项函数。

func WithConfig

func WithConfig(config Config) WebStarterOption

WithConfig 设置 Web 配置。

func WithHandler

func WithHandler(handler http.Handler) WebStarterOption

WithHandler 设置自定义处理器。

func WithLogger

func WithLogger(logger log.Logger) WebStarterOption

WithLogger 设置日志记录器。

func WithMiddlewares

func WithMiddlewares(middlewares []core.MiddlewareFunc) WebStarterOption

WithMiddlewares 设置中间件列表。

func WithName

func WithName(name string) WebStarterOption

WithName 设置启动器名称。

func WithRouter

func WithRouter(router core.Router) WebStarterOption

WithRouter 设置路由器实现。

func WithServer

func WithServer(server core.Server) WebStarterOption

WithServer 设置服务器实现。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL