@@ -26,5 +26,125 @@ public static IApplicationBuilder Use(this IApplicationBuilder app, Func<HttpCon
2626 } ;
2727 } ) ;
2828 }
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+ }
29149 }
30150}
0 commit comments