gpt4 book ai didi

domain-driven-design - 使用持久函数,如何从事件函数返回多个值

转载 作者:行者123 更新时间:2023-12-04 16:41:21 27 4
gpt4 key购买 nike

我是领域驱动设计的忠实粉丝和开发人员,并且一直在尝试将技术/架构映射到 DDD 的世界中。将微服务映射到限界上下文提供了一种自然的结合。归根结底,我只想专注于我的业务逻辑并将其托管在正确的环境中。 Durable Functions 在我看来很有前途,需要解决跨微服务、Sagas 或 Process Manager 的分布式事务问题。我多年来一直在使用 NServicebus,喜欢他们的 Saga 技术,但我想利用 Durable Function 编排来处理 saga 逻辑。我目前遇到的架构问题如下。我已将 DDD 应用程序服务映射到事件功能。因此,只需通过 Orchestrator 利用正确的 Activity Functions 集来运行其交易,即可创建 Saga。构建回滚在概念上也非常简单,但我遇到了实现问题。另外,每个 Activity Function 都将委托(delegate)给处理所有业务逻辑细节的库,然后获取业务逻辑返回的事件列表并将其返回给 Orchestrator。据我研究,没有办法从事件函数返回多态返回值。因此,如果我的业务逻辑生成 UpdateSucceeded 或 UpdateFailed 事件,我如何简单地将其从我的 Activity Function 返回到 Orchestrator,以便 Orchestrator 可以通过调用不同的回滚 Activity Functions 来采取纠正措施?

最佳答案

您可以在 Durable Functions 2.1.0 中使用新的自定义序列化程序支持去做这个。它仍然需要记录,但基本上它是这样工作的,使用 Azure Functions dependency injection :

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 };
}
}

现在,如果你有这样的类(class):

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 扩展序列化的所有内容。如果你想要更多的控制,你可以创建一个更复杂的序列化器。

关于domain-driven-design - 使用持久函数,如何从事件函数返回多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60231879/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com