@@ -92,14 +92,14 @@ private static void GenerateHandleMethod(IndentedStringBuilder source, HandlerIn
9292 string stronglyTypedMethodName = GetHandlerMethodName ( handler ) ;
9393
9494 string asyncModifier = handler . IsAsync ? "async " : "" ;
95- string result , accessor , parameters ;
95+ string result , accessor , parameters , defaultValue ;
9696 string returnType = handler . ReturnType . FullName ;
9797
9898 var variables = new Dictionary < string , string > ( ) ;
9999
100100 var beforeMiddleware = handler . Middleware . Where ( m => m . BeforeMethod != null ) . Select ( m => ( Method : m . BeforeMethod ! . Value , Middleware : m ) ) . ToList ( ) ;
101- var afterMiddleware = handler . Middleware . Where ( m => m . AfterMethod != null ) . Select ( m => ( Method : m . AfterMethod ! . Value , Middleware : m ) ) . ToList ( ) ;
102- var finallyMiddleware = handler . Middleware . Where ( m => m . FinallyMethod != null ) . Select ( m => ( Method : m . FinallyMethod ! . Value , Middleware : m ) ) . ToList ( ) ;
101+ var afterMiddleware = handler . Middleware . Where ( m => m . AfterMethod != null ) . Reverse ( ) . Select ( m => ( Method : m . AfterMethod ! . Value , Middleware : m ) ) . ToList ( ) ;
102+ var finallyMiddleware = handler . Middleware . Where ( m => m . FinallyMethod != null ) . Reverse ( ) . Select ( m => ( Method : m . FinallyMethod ! . Value , Middleware : m ) ) . ToList ( ) ;
103103
104104 var shouldUseTryCatch = finallyMiddleware . Any ( ) ;
105105
@@ -124,38 +124,44 @@ private static void GenerateHandleMethod(IndentedStringBuilder source, HandlerIn
124124 // build middleware instances
125125 foreach ( var m in handler . Middleware . Where ( m => m . IsStatic == false ) )
126126 {
127- source . AppendLine ( $ "var middleware { m . Identifier } = global::Foundatio.Mediator.Mediator.GetOrCreateMiddleware<{ m . FullName } >(serviceProvider);") ;
127+ source . AppendLine ( $ "var { m . Identifier . ToCamelCase ( ) } = global::Foundatio.Mediator.Mediator.GetOrCreateMiddleware<{ m . FullName } >(serviceProvider);") ;
128128 }
129129
130130 source . AppendLine ( ) ;
131131
132132 // build result variables for before methods
133133 foreach ( var m in beforeMiddleware . Where ( m => m . Method . HasReturnValue ) )
134134 {
135- var defaultValue = m . Method . ReturnType . IsNullable ? "null" : "default" ;
136- source . AppendLine ( $ "global::{ m . Method . ReturnType . FullName } result{ m . Middleware . Identifier } = { defaultValue } ;") ;
135+ bool allowNull = m . Method . ReturnType . IsNullable || m . Method . ReturnType . IsReferenceType ;
136+ defaultValue = allowNull ? "null" : "default" ;
137+ var prefix = m . Method . ReturnType . IsTuple ? "" : "global::" ;
138+ source . AppendLine ( $ "{ prefix } { m . Method . ReturnType . FullName } { ( allowNull ? "?" : "" ) } { m . Middleware . Identifier . ToCamelCase ( ) } Result = { defaultValue } ;") ;
137139 }
138140
139141 source . AppendLine ( ) ;
142+ defaultValue = handler . ReturnType . IsNullable ? "null" : "default" ;
143+ source . AppendLine ( $ "{ handler . ReturnType . UnwrappedFullName } handlerResult = { defaultValue } ;") ;
140144
141145 if ( shouldUseTryCatch )
142146 {
143147 source . AppendLine ( """
144- global::System.Exception? exception = null;");
148+ global::System.Exception? exception = null;
145149
146150 try
147151 {
148152 """ ) ;
149153
154+ variables [ "System.Exception" ] = "exception" ;
155+
150156 source . IncrementIndent ( ) ;
151157 }
152158
153159 // call before middleware
154160 foreach ( var m in beforeMiddleware )
155161 {
156162 asyncModifier = m . Middleware . IsAsync ? "await " : "" ;
157- result = m . Method . ReturnType . IsVoid ? "" : $ "result { m . Middleware . Identifier } = ";
158- accessor = m . Middleware . IsStatic ? m . Middleware . FullName : $ "middleware { m . Middleware . Identifier } ";
163+ result = m . Method . ReturnType . IsVoid ? "" : $ "{ m . Middleware . Identifier . ToCamelCase ( ) } Result = ";
164+ accessor = m . Middleware . IsStatic ? m . Middleware . FullName : $ "{ m . Middleware . Identifier . ToCamelCase ( ) } ";
159165 parameters = BuildParameters ( m . Method . Parameters ) ;
160166
161167 source . AppendLine ( $ "{ result } { asyncModifier } { accessor } .{ m . Method . MethodName } ({ parameters } );") ;
@@ -164,24 +170,27 @@ private static void GenerateHandleMethod(IndentedStringBuilder source, HandlerIn
164170
165171 // call handler
166172 asyncModifier = handler . IsAsync ? "await " : "" ;
167- result = handler . ReturnType . IsVoid ? "" : $ "var handlerResult = ";
173+ result = handler . ReturnType . IsVoid ? "" : shouldUseTryCatch ? " handlerResult = " : "return ";
168174 accessor = handler . IsStatic ? handler . FullName : $ "handlerInstance";
169175 parameters = BuildParameters ( handler . Parameters ) ;
176+
170177 source . AppendLineIf ( "var handlerInstance = GetOrCreateHandler(serviceProvider);" , ! handler . IsStatic ) ;
171178 source . AppendLine ( $ "{ result } { asyncModifier } { accessor } .{ handler . MethodName } ({ parameters } );") ;
172- source . AppendLine ( ) ;
179+ source . AppendLineIf ( handler . HasReturnValue ) ;
173180
174181 // call after middleware
175182 foreach ( var m in afterMiddleware )
176183 {
177184 asyncModifier = m . Middleware . IsAsync ? "await " : "" ;
178- accessor = m . Middleware . IsStatic ? m . Middleware . FullName : $ "middleware { m . Middleware . Identifier } ";
179- parameters = BuildParameters ( m . Method . Parameters ) ;
185+ accessor = m . Middleware . IsStatic ? m . Middleware . FullName : $ "{ m . Middleware . Identifier . ToCamelCase ( ) } ";
186+ parameters = BuildParameters ( m . Method . Parameters , variables ) ;
180187
181188 source . AppendLine ( $ "{ asyncModifier } { accessor } .{ m . Method . MethodName } ({ parameters } );") ;
182189 }
183190 source . AppendLineIf ( afterMiddleware . Any ( ) ) ;
184191
192+ source . AppendLineIf ( "return handlerResult;" , handler . HasReturnValue ) ;
193+
185194 if ( shouldUseTryCatch )
186195 {
187196 source . DecrementIndent ( ) ;
@@ -203,30 +212,23 @@ private static void GenerateHandleMethod(IndentedStringBuilder source, HandlerIn
203212 foreach ( var m in finallyMiddleware )
204213 {
205214 asyncModifier = m . Method . IsAsync ? "await " : "" ;
206- accessor = m . Method . IsStatic ? m . Middleware . FullName : $ "middleware { m . Middleware . Identifier } ";
207- parameters = BuildParameters ( m . Method . Parameters ) ;
215+ accessor = m . Method . IsStatic ? m . Middleware . FullName : $ "{ m . Middleware . Identifier . ToCamelCase ( ) } ";
216+ parameters = BuildParameters ( m . Method . Parameters , variables ) ;
208217
209218 source . AppendLine ( $ "{ asyncModifier } { accessor } .{ m . Method . MethodName } ({ parameters } );") ;
210219 }
211220
212221 source . DecrementIndent ( ) ;
213222
214223 source . AppendLine ( "}" ) ;
215- source . AppendLine ( ) ;
216-
217- source . DecrementIndent ( ) ;
218- }
219-
220- if ( handler . HasReturnValue )
221- {
222- source . AppendLine ( "return handlerResult;" ) ;
223224 }
224225
226+ source . DecrementIndent ( ) ;
225227 source . AppendLine ( "}" ) ;
226228 source . AppendLine ( ) ;
227229 }
228230
229- private static string BuildParameters ( EquatableArray < ParameterInfo > parameters )
231+ private static string BuildParameters ( EquatableArray < ParameterInfo > parameters , Dictionary < string , string > ? variables = null )
230232 {
231233 var parameterValues = new List < string > ( ) ;
232234
@@ -236,14 +238,25 @@ private static string BuildParameters(EquatableArray<ParameterInfo> parameters)
236238 {
237239 parameterValues . Add ( "message" ) ;
238240 }
241+ else if ( param . Type . IsObject && param . Name == "handlerResult" )
242+ {
243+ parameterValues . Add ( "handlerResult" ) ;
244+ }
239245 else if ( param . Type . IsCancellationToken )
240246 {
241247 parameterValues . Add ( "cancellationToken" ) ;
242248 }
249+ else if ( variables != null && variables . TryGetValue ( param . Type . FullName , out string ? variableName ) )
250+ {
251+ parameterValues . Add ( variableName ) ;
252+ }
253+ else if ( variables != null && variables . TryGetValue ( param . Type . UnwrappedFullName , out string ? unwrappedVariableName ) )
254+ {
255+ parameterValues . Add ( unwrappedVariableName ) ;
256+ }
243257 else
244258 {
245- // This is a dependency that needs to be resolved from DI
246- parameterValues . Add ( $ "serviceProvider.GetRequiredService<{ param . Type . FullName } >()") ;
259+ parameterValues . Add ( $ "serviceProvider.GetRequiredService<global::{ param . Type . FullName } >()") ;
247260 }
248261 }
249262
0 commit comments