@@ -26,5 +26,125 @@ public static IApplicationBuilder Use(this IApplicationBuilder app, Func<HttpCon
26
26
} ;
27
27
} ) ;
28
28
}
29
+
30
+ /// <summary>
31
+ /// Use middleware defined in-line
32
+ /// </summary>
33
+ /// <typeparam name="TService1">Per-request service required by middleware</typeparam>
34
+ /// <param name="app"></param>
35
+ /// <param name="middleware">A function that handles the request or calls the given next function.</param>
36
+ /// <returns></returns>
37
+ public static IApplicationBuilder Use < TService1 > ( this IApplicationBuilder app , Func < HttpContext , Func < Task > , TService1 , Task > middleware )
38
+ {
39
+ var applicationServices = app . ApplicationServices ;
40
+ return app . Use ( next => context =>
41
+ {
42
+ var serviceProvider = context . RequestServices ?? context . ApplicationServices ?? applicationServices ;
43
+ if ( serviceProvider == null )
44
+ {
45
+ throw new Exception ( "TODO: IServiceProvider is not available" ) ;
46
+ }
47
+ return middleware (
48
+ context ,
49
+ ( ) => next ( context ) ,
50
+ GetRequiredService < TService1 > ( serviceProvider ) ) ;
51
+ } ) ;
52
+ }
53
+
54
+ /// <summary>
55
+ /// Use middleware defined in-line
56
+ /// </summary>
57
+ /// <typeparam name="TService1">Per-request service required by middleware</typeparam>
58
+ /// <typeparam name="TService2">Per-request service required by middleware</typeparam>
59
+ /// <param name="app"></param>
60
+ /// <param name="middleware">A function that handles the request or calls the given next function.</param>
61
+ /// <returns></returns>
62
+ public static IApplicationBuilder Use < TService1 , TService2 > ( this IApplicationBuilder app , Func < HttpContext , Func < Task > , TService1 , TService2 , Task > middleware )
63
+ {
64
+ var applicationServices = app . ApplicationServices ;
65
+ return app . Use ( next => context =>
66
+ {
67
+ var serviceProvider = context . RequestServices ?? context . ApplicationServices ?? applicationServices ;
68
+ if ( serviceProvider == null )
69
+ {
70
+ throw new Exception ( "TODO: IServiceProvider is not available" ) ;
71
+ }
72
+ return middleware (
73
+ context ,
74
+ ( ) => next ( context ) ,
75
+ GetRequiredService < TService1 > ( serviceProvider ) ,
76
+ GetRequiredService < TService2 > ( serviceProvider ) ) ;
77
+ } ) ;
78
+ }
79
+
80
+ /// <summary>
81
+ /// Use middleware defined in-line
82
+ /// </summary>
83
+ /// <typeparam name="TService1">Per-request service required by middleware</typeparam>
84
+ /// <typeparam name="TService2">Per-request service required by middleware</typeparam>
85
+ /// <typeparam name="TService3">Per-request service required by middleware</typeparam>
86
+ /// <param name="app"></param>
87
+ /// <param name="middleware">A function that handles the request or calls the given next function.</param>
88
+ /// <returns></returns>
89
+ public static IApplicationBuilder Use < TService1 , TService2 , TService3 > ( this IApplicationBuilder app , Func < HttpContext , Func < Task > , TService1 , TService2 , TService3 , Task > middleware )
90
+ {
91
+ var applicationServices = app . ApplicationServices ;
92
+ return app . Use ( next => context =>
93
+ {
94
+ var serviceProvider = context . RequestServices ?? context . ApplicationServices ?? applicationServices ;
95
+ if ( serviceProvider == null )
96
+ {
97
+ throw new Exception ( "TODO: IServiceProvider is not available" ) ;
98
+ }
99
+ return middleware (
100
+ context ,
101
+ ( ) => next ( context ) ,
102
+ GetRequiredService < TService1 > ( serviceProvider ) ,
103
+ GetRequiredService < TService2 > ( serviceProvider ) ,
104
+ GetRequiredService < TService3 > ( serviceProvider ) ) ;
105
+ } ) ;
106
+ }
107
+
108
+ /// <summary>
109
+ /// Use middleware defined in-line
110
+ /// </summary>
111
+ /// <typeparam name="TService1">Per-request service required by middleware</typeparam>
112
+ /// <typeparam name="TService2">Per-request service required by middleware</typeparam>
113
+ /// <typeparam name="TService3">Per-request service required by middleware</typeparam>
114
+ /// <typeparam name="TService4">Per-request service required by middleware</typeparam>
115
+ /// <param name="app"></param>
116
+ /// <param name="middleware">A function that handles the request or calls the given next function.</param>
117
+ /// <returns></returns>
118
+ public static IApplicationBuilder Use < TService1 , TService2 , TService3 , TService4 > ( this IApplicationBuilder app , Func < HttpContext , Func < Task > , TService1 , TService2 , TService3 , TService4 , Task > middleware )
119
+ {
120
+ var applicationServices = app . ApplicationServices ;
121
+ return app . Use ( next => context =>
122
+ {
123
+ var serviceProvider = context . RequestServices ?? context . ApplicationServices ?? applicationServices ;
124
+ if ( serviceProvider == null )
125
+ {
126
+ throw new Exception ( "TODO: IServiceProvider is not available" ) ;
127
+ }
128
+ return middleware (
129
+ context ,
130
+ ( ) => next ( context ) ,
131
+ GetRequiredService < TService1 > ( serviceProvider ) ,
132
+ GetRequiredService < TService2 > ( serviceProvider ) ,
133
+ GetRequiredService < TService3 > ( serviceProvider ) ,
134
+ GetRequiredService < TService4 > ( serviceProvider ) ) ;
135
+ } ) ;
136
+ }
137
+
138
+ private static TService GetRequiredService < TService > ( IServiceProvider serviceProvider )
139
+ {
140
+ var service = ( TService ) serviceProvider . GetService ( typeof ( TService ) ) ;
141
+
142
+ if ( service == null )
143
+ {
144
+ throw new Exception ( string . Format ( "TODO: No service for type '{0}' has been registered." , typeof ( TService ) ) ) ;
145
+ }
146
+
147
+ return service ;
148
+ }
29
149
}
30
150
}
0 commit comments