YoyoGo基于ASP.NET Core设计的Golang实现
YoyoGo
YoyoGo 是一个用 Go 编写的简单,轻便,快速的 微服务框架,目前已实现了Web框架的能力,但是底层设计已支持。

Github
https://github.com/yoyofx/yoyogo
特色
- 漂亮又快速的路由器
- 中间件支持 (handler func & custom middleware)
- 对 REST API 友好
- 支持 MVC 模式
- 受到许多出色的 Go Web 框架的启发
框架安装
go get github.com/yoyofx/yoyogo
安装依赖 (由于某些原因国内下载不了依赖)
go version < 1.13
window 下在 cmd 中执行:
set GO111MODULE=on
set  GOPROXY=https://goproxy.cn
linux  下执行:
export GO111MODULE=on
export GOPROXY=https://goproxy.cn
go version >= 1.13
go env -w GOPROXY=https://goproxy.cn,direct
简单的例子
package main
import ...
func main() {
    YoyoGo.CreateDefaultBuilder(func(router Router.IRouterBuilder) {
        router.GET("/info",func (ctx *Context.HttpContext) {    // 支持Group方式
            ctx.JSON(200, Context.M{"info": "ok"})
        })
    }).Build().Run()       //默认端口号 :8080
}

实现进度
标准功能
- [X] 打印Logo和日志(YoyoGo)
- [X] 统一程序输入参数和环境变量 (YoyoGo)
- [X] 简单路由器绑定句柄功能
- [X] HttpContext 上下文封装(请求,响应)
- [X] 静态文件端点(静态文件服务器)
- [X] JSON 序列化结构(Context.M)
- [X] 获取请求文件并保存
- [X] 获取请求数据(form-data,x-www-form-urlencoded,Json ,XML,Protobuf 等)
- [X] Http 请求的绑定模型(Url, From,JSON,XML,Protobuf)
响应渲染功能
- [X] Render Interface
- [X] JSON Render
- [X] JSONP Render
- [X] Indented Json Render
- [X] Secure Json Render
- [X] Ascii Json Render
- [X] Pure Json Render
- [X] Binary Data Render
- [X] TEXT
- [X] Protobuf
- [X] MessagePack
- [X] XML
- [X] YAML
- [X] File
- [X] Image
- [X] Template
- [X] Auto formater Render
中间件
- [X] Logger
- [X] StaticFile
- [X] Router Middleware
- [ ] Session
- [ ] CORS
- [ ] GZip
- [X] Binding
- [ ] Binding Valateion
路由
- [x] GET,POST,HEAD,PUT,DELETE 方法支持
- [x] 路由解析树与表达式支持
- [x] RouteData路由数据 (/api/:version/) 与 Binding的集成
- [x] 路由组功能
- [ ] MVC默认模板功能
- [ ] 路由过滤器 Filter
MVC
- [x] 路由请求触发Controller&Action
- [X] Action方法参数绑定
- [ ] 内部对象的DI化
- [ ] 关键对象的参数传递
Dependency injection
- [X] 抽象集成第三方DI框架
- [X] MVC模式集成
- [X] 框架级的DI支持功能
扩展
- [ ] 配置
- [ ] WebSocket
- [ ] JWT
- [ ] swagger
- [ ] GRpc
- [ ] OAuth2
- [ ] Prometheus
- [ ] 安全
进阶范例
package main
import ...
func main() {
	webHost := CreateCustomWebHostBuilder().Build()
	webHost.Run()
}
// 自定义HostBuilder并支持 MVC 和 自动参数绑定功能,简单情况也可以直接使用CreateDefaultBuilder 。
func CreateCustomBuilder() *Abstractions.HostBuilder {
	return YoyoGo.NewWebHostBuilder().
		SetEnvironment(Context.Prod).
		UseFastHttp().
		//UseServer(YoyoGo.DefaultHttps(":8080", "./Certificate/server.pem", "./Certificate/server.key")).
		Configure(func(app *YoyoGo.WebApplicationBuilder) {
			app.UseStatic("Static")
			app.UseEndpoints(registerEndpointRouterConfig)
			app.UseMvc(func(builder *Mvc.ControllerBuilder) {
				builder.AddController(contollers.NewUserController)
			})
		}).
		ConfigureServices(func(serviceCollection *DependencyInjection.ServiceCollection) {
			serviceCollection.AddTransientByImplements(models.NewUserAction, new(models.IUserAction))
		}).
		OnApplicationLifeEvent(getApplicationLifeEvent)
}
//region endpoint 路由绑定函数
func registerEndpoints(router Router.IRouterBuilder) {
	router.GET("/error", func(ctx *Context.HttpContext) {
		panic("http get error")
	})
    //POST 请求: /info/:id ?q1=abc&username=123
	router.POST("/info/:id", func (ctx *Context.HttpContext) {
        qs_q1 := ctx.Query("q1")
        pd_name := ctx.Param("username")
        userInfo := &UserInfo{}
        _ = ctx.Bind(userInfo)    // 手动绑定请求对象
        strResult := fmt.Sprintf("Name:%s , Q1:%s , bind: %s", pd_name, qs_q1, userInfo)
        ctx.JSON(200, Std.M{"info": "hello world", "result": strResult})
    })
    // 路由组功能实现绑定 GET 请求:  /v1/api/info
	router.Group("/v1/api", func(router *Router.RouterGroup) {
		router.GET("/info", func (ctx *Context.HttpContext) {
	        ctx.JSON(200, Std.M{"info": "ok"})
        })
	})
    // GET 请求: HttpContext.RequiredServices获取IOC对象
	router.GET("/ioc", func (ctx *Context.HttpContext) {
        var userAction models.IUserAction
        _ = ctx.RequiredServices.GetService(&userAction)
        ctx.JSON(200, Std.M{"info": "ok " + userAction.Login("zhang")})
    })
}
//endregion
//region 请求对象
type UserInfo struct {
	UserName string `param:"username"`
	Number   string `param:"q1"`
	Id       string `param:"id"`
}
// ----------------------------------------- MVC 定义 ------------------------------------------------------
// 定义Controller
type UserController struct {
	*Controller.ApiController
	userAction models.IUserAction    // IOC 对象参数
}
// 构造器依赖注入
func NewUserController(userAction models.IUserAction) *UserController {
	return &UserController{userAction: userAction}
}
// 请求对象的参数化绑定
type RegiserRequest struct {
	Controller.RequestParam
	UserName string `param:"username"`
	Password string `param:"password"`
}
// Register函数自动绑定参数
func (this *UserController) Register(ctx *Context.HttpContext, request *RegiserRequest) ActionResult.IActionResult {
	result := Controller.ApiResult{Success: true, Message: "ok", Data: request}
	return ActionResult.Json{Data: result}
}
// use userAction interface by ioc
func (this *UserController) GetInfo() Controller.ApiResult {
	return this.OK(this.userAction.Login("zhang"))
}
// Web程序的开始与停止事件
func fireApplicationLifeEvent(life *YoyoGo.ApplicationLife) {
	printDataEvent := func(event YoyoGo.ApplicationEvent) {
		fmt.Printf("[yoyogo] Topic: %s; Event: %v\n", event.Topic, event.Data)
	}
	for {
		select {
		case ev := <-life.ApplicationStarted:
			go printDataEvent(ev)
		case ev := <-life.ApplicationStopped:
			go printDataEvent(ev)
			break
		}
	}
}
YoyoGo基于ASP.NET Core设计的Golang实现的更多相关文章
- 基于ASP.Net Core开发的一套通用后台框架
		基于ASP.Net Core开发一套通用后台框架 写在前面 这是本人在学习的过程中搭建学习的框架,如果对你有所帮助那再好不过.如果您有发现错误,请告知我,我会第一时间修改. 知其然,知其所以然,并非重 ... 
- 基于ASP.NET Core 6.0的整洁架构
		大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进. 本节将介绍基于ASP.NET Core的整洁架构的设计理念,同时基于理论落地的代码 ... 
- 用VSCode开发一个基于asp.net core 2.0/sql server linux(docker)/ng5/bs4的项目(1)
		最近使用vscode比较多. 学习了一下如何在mac上使用vscode开发asp.netcore项目. 这里是我写的关于vscode的一篇文章: https://www.cnblogs.com/cgz ... 
- 如何基于asp.net core的Identity框架在mysql上作身份验证处理
		首先了解这个概念,我一开始也是理解和掌握基本的概念,再去做程序的开发.Identity框架是微软自己提供,基于.net core平台,可拓展.轻量 级.面向多个数据库的身份验证框架.IdentityS ... 
- 基于Asp.Net Core的简单社区项目源代码开源
		2019年3月27号 更新版本 本项目基于 ASP.NET CORE 3.0+EF CORE 3.0开发 使用vs2019 +sqlserver 2017(数据库脚本最低支持sql server 20 ... 
- AServer - 基于Asp.net core Kestrel的超迷你http服务器
		AServer是基于ASP.NET Core Kestrel封装的一个超迷你http服务器.它可以集成进你的Core程序里,用来快速的响应Http请求,而不需要集成整个ASP.NET Core MVC ... 
- 基于ASP.NET Core 创建 Web API
		使用 Visual Studio 创建项目. 文件->新建->项目,选择创建 ASP.NET Core Web 应用程序. 基于 ASP.NET Core 2.0 ,选择API,身份验证选 ... 
- 基于ASP.NET Core 3.0快速搭建Razor Pages Web应用
		前言 虽然说学习新的开发框架是一项巨大的投资,但是作为一个开发人员,不断学习新的技术并快速上手是我们应该掌握的技能,甚至是一个.NET Framework开发人员,学习.NET Core 新框架可以更 ... 
- [译]基于ASP.NET Core 3.0的ABP v0.21已发布
		基于ASP.NET Core 3.0的ABP v0.21已发布 在微软发布仅仅一个小时后, 基于ASP.NET Core 3.0的ABP v0.21也紧跟着发布了. v0.21没有新功能.它只是升级到 ... 
随机推荐
- 前端HTML div标签的用法 盒子模型
			盒子模型 边框 border -外边距 margin- 内容与边框距离padding[会撑大div边框]- 宽width-高height. div的奇特玩法 1.把div弄成圆形 [css设置bord ... 
- Java 第十一届 蓝桥杯 省模拟赛 凯撒密码加密
			凯撒密码加密 题目 问题描述 给定一个单词,请使用凯撒密码将这个单词加密. 凯撒密码是一种替换加密的技术,单词中的所有字母都在字母表上向后偏移3位后被替换成密文.即a变为d,b变为e,-,w变为z,x ... 
- Java实现 LeetCode 692 前K个高频单词(map的应用)
			692. 前K个高频单词 给一非空的单词列表,返回前 k 个出现次数最多的单词. 返回的答案应该按单词出现频率由高到低排序.如果不同的单词有相同出现频率,按字母顺序排序. 示例 1: 输入: [&qu ... 
- Java实现 LeetCode 554 砖墙(缝隙可以放在数组?)
			554. 砖墙 你的面前有一堵方形的.由多行砖块组成的砖墙. 这些砖块高度相同但是宽度不同.你现在要画一条自顶向下的.穿过最少砖块的垂线. 砖墙由行的列表表示. 每一行都是一个代表从左至右每块砖的宽度 ... 
- Java实现 LeetCode 19删除链表的倒数第N个节点
			19. 删除链表的倒数第N个节点 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当 ... 
- java实现拼出漂亮的表格
			/* * 在中文 Windows 环境下,控制台窗口中也可以用特殊符号拼出漂亮的表格来. 比如: ┌─┬─┐ │ │ │ ├─┼─┤ │ │ │ └─┴─┘ 其实,它是由如下的符号拼接的: 左上 = ... 
- 服务端监控工具Nmon使用方法
			一.认识nmon 1.简介 nmon是一种在AIX与各种Linux操作系统上广泛使用的监控与分析工具,它能在系统运行过程中实时地捕捉系统资源的使用情况,记录的信息比较全面, 并且能输出结果到文件中,然 ... 
- 【原创】Linux中断子系统(二)-通用框架处理
			背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ... 
- golang连接达梦数据库的一个坑
			golang连接达梦数据库的一个坑 有一次项目中用到了达梦数据库,后端语言使用的golang,达梦官方并未适配专门的golang连接方式,正一筹莫展的时候发现达梦提供了odbc的连接,这样可以使用类似 ... 
- 实战记录之SQL server报错手工注入
			前言 最近测试了一个站点,这个站点挺有意思,发现没有关闭错误提示,初步猜测是SQL server数据库,后来验证确实是.在这里记录一下实战过程,并详细讲解一下用到的知识点. SQL server报错注 ... 
