Skip to content

MVC 中间件

MVC 中间件用于处理基于控制器和视图的请求分发,是实现 Web API 和页面渲染的核心组件。

注册mvc中间件

cangjie

import std.reflect.*
import demo.controllers.*

main(): Int64 {
    let builder = WebHost.createBuilder()
    // 注册控制器(会自动注册路由服务)
    builder.services.addControllers() 
        .addApplicationPart(PackageInfo.get("demo.controllers")) 
    let app = builder.build()
    app.mapControllers() 
    app.run()
    return 0
}

编写Controller

cangjie
@Route["api/[controller]"]
public class HelloController <: Controller {

    // 依赖注入
    public HelloController(let logger: ILogger<HelloController>) {

    }

    // FromServices: 从容器中绑定
    @HttpGet
    public func hello(@FromServices configuration: IConfiguration) {
        return "hello"
    }

    @HttpGet["{id}"]
    public func getByid(@FromRoute id: Int64) {
        return "success"
    }

    //@FromBody是默认的,可以缺省 
    @HttpPost
    public func post(@FromBody model: HelloModel) {
        return "success"
    }

    @HttpDelete["{id}"]
    public func delete(@FromRoute id: Int64) {
        return "success"
    }

    @HttpGet["list"]
    @HttpPost["list"]
    public func getList() {
        let list = ArrayList<HelloModel>()
        list.add(HelloModel(1, "spire", 1))
        return json(list.toArray())
    }
}

// 我们提供了序列化的宏
@Serialization
public class HelloModel {    
    private var _id: ?Int64 = None
    private var _name: String = String.empty
    private var _age: Int64 = 0

    public init(id: ?Int64, name: String, age: Int64) {
        this._id = id
        this._name = name
        this._age = age
    }
}
  • 我们内置了两个路由常量[controller][action]运行时会替换为对应的控制名和动作名
  • 如果路径以/开头那么将忽略路由模板从根路径开始定义。

配置选项

ApiBehaviorOptions

配置模型验证失败的响应内容

cangjie
builder.services.configure<ApiBehaviorOptions> { configureOptions => 
    configureOptions.invalidModelStateResponseFactory = {
        context => ContentResult("参数不合法", 400)
    }
}

MvcOptions

cangjie
builder.services.addControllers()
    .addMvcOptions { options => 
        // 设置日期格式
        options.jsonSerializerOptions.dateFormatString = "yyyy-MM-dd HH:mm:ss"
        // 允许前端,提供字符串格式的数字
        options.jsonSerializerOptions.numberHandling = JsonNumberHandling.AllowReadingFromString
    }
    .addApplicationPart("demo.controllers")