Mic*_*ick 3 domain-driven-design azure-durable-functions
我是领域驱动设计的忠实粉丝和开发人员,并且一直试图将技术/架构映射到 DDD 的世界中。将微服务映射到有界上下文提供了一种自然的结合。归根结底,我只想专注于我的业务逻辑并将其托管在正确的环境中。Durable Functions 对我来说很有希望,它需要解决跨微服务、Sagas 或 Process Manager 的分布式事务问题(如果愿意的话)。我多年来一直在使用 NServicebus,并且喜欢他们的 Saga 技术,但希望利用 Durable Function 编排来处理 saga 逻辑。我目前遇到的架构问题如下。我已将 DDD 应用程序服务映射到一个活动函数。因此,只需使用 Orchestrator 轻敲正确的活动功能集来运行其事务即可创建 Saga。从概念上讲,构建回滚也非常简单,但我遇到了实现问题。顺便说一句,每个 Activity Function 都将委托给一个处理所有业务逻辑细节的库,然后将业务逻辑返回的事件列表返回给 Orchestrator。据我研究,没有办法从活动函数返回多态返回值。因此,如果我的业务逻辑生成 UpdateSucceeded 或 UpdateFailed 事件,我将如何简单地将其从我的活动函数返回到 Orchestrator,以便 Orchestrator 可以通过调用不同的回滚活动函数来采取纠正措施?
您可以使用 Durable Functions 2.1.0 中新的自定义序列化程序支持来执行此操作。它仍然需要记录,但基本上它是这样工作的,使用 Azure Functions依赖注入:
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 };
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果您有这样的课程:
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";
}
}
Run Code Online (Sandbox Code Playgroud)
你有这样的编排和活动功能:
[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();
Run Code Online (Sandbox Code Playgroud)
上述自定义序列化程序适用于 Durable Functions 扩展序列化的所有内容。如果您想要更多控制,您可以创建更复杂的序列化程序。