diff --git a/src/Worker.Extensions.DurableTask/ActivityInputConverter.cs b/src/Worker.Extensions.DurableTask/ActivityInputConverter.cs new file mode 100644 index 000000000..518b1ded7 --- /dev/null +++ b/src/Worker.Extensions.DurableTask/ActivityInputConverter.cs @@ -0,0 +1,41 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. + +using System; +using System.Threading.Tasks; +using Microsoft.Azure.Functions.Worker.Converters; +using Microsoft.DurableTask.Worker; +using Microsoft.Extensions.Options; + +namespace Microsoft.Azure.Functions.Worker.Extensions.DurableTask; + +internal class ActivityInputConverter : IInputConverter +{ + private readonly DurableTaskWorkerOptions options; + + public ActivityInputConverter(IOptions options) + { + this.options = options?.Value ?? throw new ArgumentNullException(nameof(options)); + } + + public ValueTask ConvertAsync(ConverterContext context) + { + if (context is null) + { + throw new ArgumentNullException(nameof(context)); + } + + if (context.Source is null) + { + return new(ConversionResult.Success(null)); + } + + if (context.Source is not string source) + { + throw new InvalidOperationException($"Expected converter source to be a string, received {context.Source?.GetType()}."); + } + + object? value = this.options.DataConverter.Deserialize(source, context.TargetType); + return new(ConversionResult.Success(value)); + } +} diff --git a/src/Worker.Extensions.DurableTask/ActivityTriggerAttribute.cs b/src/Worker.Extensions.DurableTask/ActivityTriggerAttribute.cs index 6ec7d436a..f4b944192 100644 --- a/src/Worker.Extensions.DurableTask/ActivityTriggerAttribute.cs +++ b/src/Worker.Extensions.DurableTask/ActivityTriggerAttribute.cs @@ -3,7 +3,9 @@ using System; using System.Diagnostics; +using Microsoft.Azure.Functions.Worker.Converters; using Microsoft.Azure.Functions.Worker.Extensions.Abstractions; +using Microsoft.Azure.Functions.Worker.Extensions.DurableTask; namespace Microsoft.Azure.Functions.Worker; @@ -12,6 +14,8 @@ namespace Microsoft.Azure.Functions.Worker; /// [AttributeUsage(AttributeTargets.Parameter)] [DebuggerDisplay("{Activity}")] +[InputConverter(typeof(ActivityInputConverter))] +[ConverterFallbackBehavior(ConverterFallbackBehavior.Disallow)] public sealed class ActivityTriggerAttribute : TriggerBindingAttribute { /// diff --git a/src/Worker.Extensions.DurableTask/DurableClientAttribute.cs b/src/Worker.Extensions.DurableTask/DurableClientAttribute.cs index 86e93814c..21758f81a 100644 --- a/src/Worker.Extensions.DurableTask/DurableClientAttribute.cs +++ b/src/Worker.Extensions.DurableTask/DurableClientAttribute.cs @@ -1,13 +1,17 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. +using Microsoft.Azure.Functions.Worker.Converters; using Microsoft.Azure.Functions.Worker.Extensions.Abstractions; +using Microsoft.Azure.Functions.Worker.Extensions.DurableTask; namespace Microsoft.Azure.Functions.Worker; /// /// Azure Functions attribute for binding a function parameter to a Durable Task client object. /// +[InputConverter(typeof(DurableTaskClientConverter))] +[ConverterFallbackBehavior(ConverterFallbackBehavior.Disallow)] public sealed class DurableClientAttribute : InputBindingAttribute { /// diff --git a/src/Worker.Extensions.DurableTask/DurableTaskExtensionStartup.cs b/src/Worker.Extensions.DurableTask/DurableTaskExtensionStartup.cs index e1edbd095..626acd6bf 100644 --- a/src/Worker.Extensions.DurableTask/DurableTaskExtensionStartup.cs +++ b/src/Worker.Extensions.DurableTask/DurableTaskExtensionStartup.cs @@ -58,7 +58,6 @@ public override void Configure(IFunctionsWorkerApplicationBuilder applicationBui applicationBuilder.Services.Configure(o => { - o.InputConverters.RegisterAt(0); o.InputConverters.Register(); }); diff --git a/src/Worker.Extensions.DurableTask/HTTP/HttpHeadersConverter.cs b/src/Worker.Extensions.DurableTask/HTTP/HttpHeadersConverter.cs index d41acef5e..d59b944c3 100644 --- a/src/Worker.Extensions.DurableTask/HTTP/HttpHeadersConverter.cs +++ b/src/Worker.Extensions.DurableTask/HTTP/HttpHeadersConverter.cs @@ -28,7 +28,7 @@ public override IDictionary Read( var valueList = new List(); while (reader.Read() && reader.TokenType != JsonTokenType.EndObject) { - string? propertyName = reader.GetString(); + string propertyName = reader.GetString()!; reader.Read(); @@ -42,7 +42,7 @@ public override IDictionary Read( { while (reader.Read() && reader.TokenType != JsonTokenType.EndArray) { - valueList.Add(reader.GetString()); + valueList.Add(reader.GetString()!); } values = new StringValues(valueList.ToArray()); @@ -62,8 +62,7 @@ public override void Write( { writer.WriteStartObject(); - var headers = (IDictionary)value; - foreach (var pair in headers) + foreach (KeyValuePair pair in value) { if (pair.Value.Count == 1) { diff --git a/src/Worker.Extensions.DurableTask/Worker.Extensions.DurableTask.csproj b/src/Worker.Extensions.DurableTask/Worker.Extensions.DurableTask.csproj index e0b141107..c445f7121 100644 --- a/src/Worker.Extensions.DurableTask/Worker.Extensions.DurableTask.csproj +++ b/src/Worker.Extensions.DurableTask/Worker.Extensions.DurableTask.csproj @@ -37,7 +37,7 @@ - +