1
0
mirror of synced 2024-07-03 09:00:36 +00:00

Fixed Tapeti trying to publish return types of type Task

This commit is contained in:
Mark van Renswoude 2017-02-13 15:47:57 +01:00
parent 7aa5e9ffdc
commit eb10f1f4aa
3 changed files with 22 additions and 15 deletions

View File

@ -54,11 +54,11 @@ namespace Tapeti.Flow.Default
private static void RegisterYieldPointResult(IBindingContext context) private static void RegisterYieldPointResult(IBindingContext context)
{ {
bool isTask; bool isTaskOf;
if (!context.Result.Info.ParameterType.IsTypeOrTaskOf(typeof(IYieldPoint), out isTask)) if (!context.Result.Info.ParameterType.IsTypeOrTaskOf(typeof(IYieldPoint), out isTaskOf))
return; return;
if (isTask) if (isTaskOf)
{ {
context.Result.SetHandler(async (messageContext, value) => context.Result.SetHandler(async (messageContext, value) =>
{ {
@ -92,8 +92,8 @@ namespace Tapeti.Flow.Default
if (request?.Response == null) if (request?.Response == null)
return; return;
bool isTask; bool isTaskOf;
if (!context.Result.Info.ParameterType.IsTypeOrTaskOf(t => t == request.Response || t == typeof(IYieldPoint), out isTask)) if (!context.Result.Info.ParameterType.IsTypeOrTaskOf(t => t == request.Response || t == typeof(IYieldPoint), out isTaskOf))
throw new ResponseExpectedException($"Response of class {request.Response.FullName} expected in controller {context.Method.DeclaringType?.FullName}, method {context.Method.Name}"); throw new ResponseExpectedException($"Response of class {request.Response.FullName} expected in controller {context.Method.DeclaringType?.FullName}, method {context.Method.Name}");
} }
} }

View File

@ -18,13 +18,13 @@ namespace Tapeti.Default
return; return;
bool isTask; bool isTaskOf;
Type actualType; Type actualType;
if (!context.Result.Info.ParameterType.IsTypeOrTaskOf(t => t.IsClass, out isTask, out actualType)) if (!context.Result.Info.ParameterType.IsTypeOrTaskOf(t => t.IsClass, out isTaskOf, out actualType))
return; return;
if (isTask) if (isTaskOf)
{ {
var handler = GetType().GetMethod("PublishGenericTaskResult", BindingFlags.NonPublic | BindingFlags.Static).MakeGenericMethod(actualType); var handler = GetType().GetMethod("PublishGenericTaskResult", BindingFlags.NonPublic | BindingFlags.Static).MakeGenericMethod(actualType);

View File

@ -5,11 +5,18 @@ namespace Tapeti.Helpers
{ {
public static class TaskTypeHelper public static class TaskTypeHelper
{ {
public static bool IsTypeOrTaskOf(this Type type, Func<Type, bool> predicate, out bool isTask, out Type actualType) public static bool IsTypeOrTaskOf(this Type type, Func<Type, bool> predicate, out bool isTaskOf, out Type actualType)
{ {
if (type == typeof(Task))
{
isTaskOf = false;
actualType = type;
return false;
}
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Task<>)) if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Task<>))
{ {
isTask = true; isTaskOf = true;
var genericArguments = type.GetGenericArguments(); var genericArguments = type.GetGenericArguments();
if (genericArguments.Length == 1 && predicate(genericArguments[0])) if (genericArguments.Length == 1 && predicate(genericArguments[0]))
@ -19,21 +26,21 @@ namespace Tapeti.Helpers
} }
} }
isTask = false; isTaskOf = false;
actualType = type; actualType = type;
return predicate(type); return predicate(type);
} }
public static bool IsTypeOrTaskOf(this Type type, Func<Type, bool> predicate, out bool isTask) public static bool IsTypeOrTaskOf(this Type type, Func<Type, bool> predicate, out bool isTaskOf)
{ {
Type actualType; Type actualType;
return IsTypeOrTaskOf(type, predicate, out isTask, out actualType); return IsTypeOrTaskOf(type, predicate, out isTaskOf, out actualType);
} }
public static bool IsTypeOrTaskOf(this Type type, Type compareTo, out bool isTask) public static bool IsTypeOrTaskOf(this Type type, Type compareTo, out bool isTaskOf)
{ {
return IsTypeOrTaskOf(type, t => t == compareTo, out isTask); return IsTypeOrTaskOf(type, t => t == compareTo, out isTaskOf);
} }
} }
} }