/
ApplicationBuilder.go
148 lines (126 loc) 路 4.29 KB
/
ApplicationBuilder.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package YoyoGo
import (
"github.com/maxzhang1985/yoyogo/Context"
"github.com/maxzhang1985/yoyogo/Controller"
"github.com/maxzhang1985/yoyogo/DependencyInjection"
"github.com/maxzhang1985/yoyogo/Middleware"
"github.com/maxzhang1985/yoyogo/Router"
"net/http"
)
// HTTP methods
const (
// DefaultAddress is used if no other is specified.
DefaultAddress = ":8080"
)
//application builder struct
type ApplicationBuilder struct {
hostContext *HostBuildContext
routerBuilder Router.IRouterBuilder
middleware middleware
handlers []Handler
Profile string
routeConfigures []func(Router.IRouterBuilder)
mvcConfigures []func(builder *Controller.ControllerBuilder)
}
// create classic application builder
func UseClassic() *ApplicationBuilder {
return &ApplicationBuilder{}
}
//region Create the builder of Web host
func CreateDefaultBuilder(routerConfig func(router Router.IRouterBuilder)) *HostBuilder {
return NewWebHostBuilder().
UseServer(DefaultHttpServer(DefaultAddress)).
Configure(func(app *ApplicationBuilder) {
app.UseStatic("Static")
app.UseEndpoints(routerConfig)
})
}
// create application builder when combo all handlers to middleware
func New(handlers ...Handler) *ApplicationBuilder {
return &ApplicationBuilder{
handlers: handlers,
middleware: build(handlers),
}
}
// create new application builder
func NewApplicationBuilder() *ApplicationBuilder {
routerBuilder := Router.NewRouterBuilder()
recovery := Middleware.NewRecovery()
logger := Middleware.NewLogger()
router := Middleware.NewRouter(routerBuilder)
self := New(logger, recovery, router)
self.routerBuilder = routerBuilder
return self
}
// after create builder , apply router and logger and recovery middleware
func (self *ApplicationBuilder) UseMvc() *ApplicationBuilder {
self.routerBuilder.(*Router.DefaultRouterBuilder).SetMvc(true)
return self
}
func (self *ApplicationBuilder) UseEndpoints(configure func(Router.IRouterBuilder)) *ApplicationBuilder {
self.routeConfigures = append(self.routeConfigures, configure)
return self
}
func (this *ApplicationBuilder) ConfigureMvcParts(configure func(builder *Controller.ControllerBuilder)) *ApplicationBuilder {
this.mvcConfigures = append(this.mvcConfigures, configure)
return this
}
func (this *ApplicationBuilder) buildEndPoints() {
for _, configure := range this.routeConfigures {
configure(this.routerBuilder)
}
}
func (this *ApplicationBuilder) buildMvc(services *DependencyInjection.ServiceCollection) {
if this.routerBuilder.IsMvc() {
controllerBuilder := Controller.NewControllerBuilder(services)
for _, configure := range this.mvcConfigures {
configure(controllerBuilder)
}
}
}
// build and combo all middleware to request delegate (ServeHTTP(w http.ResponseWriter, r *http.Request))
func (this *ApplicationBuilder) Build() IRequestDelegate {
if this.hostContext == nil {
panic("hostContext is nil! please set.")
}
this.hostContext.hostingEnvironment.Profile = this.Profile
this.middleware = build(this.handlers)
this.buildEndPoints()
this.buildMvc(this.hostContext.applicationServicesDef)
return this
}
func (this *ApplicationBuilder) SetHostBuildContext(context *HostBuildContext) {
this.hostContext = context
}
func (app *ApplicationBuilder) SetEnvironment(mode string) {
app.Profile = mode
}
// apply middleware in builder
func (app *ApplicationBuilder) UseMiddleware(handler Handler) {
if handler == nil {
panic("handler cannot be nil")
}
app.handlers = append(app.handlers, handler)
}
// apply static middleware in builder
func (app *ApplicationBuilder) UseStatic(path string) {
app.UseMiddleware(Middleware.NewStatic("Static"))
}
// apply handler middleware in builder
func (app *ApplicationBuilder) UseHandler(handler http.Handler) {
app.UseMiddleware(wrap(handler))
}
// apply handler func middleware in builder
func (app *ApplicationBuilder) UseHandlerFunc(handlerFunc func(rw http.ResponseWriter, r *http.Request)) {
app.UseMiddleware(wrapFunc(handlerFunc))
}
// apply handler func middleware in builder
func (app *ApplicationBuilder) UseFunc(handlerFunc HandlerFunc) {
app.UseMiddleware(handlerFunc)
}
/*
Middleware of Server Handler , request port.
*/
func (app *ApplicationBuilder) ServeHTTP(w http.ResponseWriter, r *http.Request) {
app.middleware.Invoke(Context.NewContext(w, r, app.hostContext.applicationServices))
}