Для этого можно использовать новую пользовательскую поддержку сериализатора в Durable Functions 2.1.0 . Это все еще нужно документировать, но в основном это работает следующим образом: Azure Функции Внедрение зависимостей :
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddSingleton<IMessageSerializerSettingsFactory, CustomMessageSerializer>();
}
}
public class CustomMessageSerializer : IMessageSerializerSettingsFactory
{
public JsonSerializerSettings CreateJsonSerializerSettings()
{
return new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All };
}
}
Теперь, если у вас есть такие классы:
public abstract class Thing
{
public abstract string GetMessage();
}
public class Foo : Thing
{
public override string GetMessage()
{
return "I'm a Foo";
}
}
public class Bar : Thing
{
public override string GetMessage()
{
return "I'm a Bar";
}
}
И у вас есть такие функции оркестровки и активности:
[FunctionName(nameof(Orchestrator))]
public static async Task<List<string>> Orchestrator(
[OrchestrationTrigger] IDurableOrchestrationContext context)
{
var outputs = new List<string>();
outputs.Add((await context.CallActivityAsync<Thing>(nameof(GetThing), true)).GetMessage());
outputs.Add((await context.CallActivityAsync<Thing>(nameof(GetThing), false)).GetMessage());
// [ "I'm a Foo", "I'm a Bar" ]
return outputs;
}
[FunctionName(nameof(GetThing))]
public static Thing GetThing([ActivityTrigger] bool isFoo, ILogger log)
=> isFoo ? (Thing)new Foo() : (Thing)new Bar();
Приведенный выше пользовательский сериализатор применяется ко всему, сериализованному расширением Durable Functions. Вы можете создать более сложный сериализатор, если хотите больше контроля.