Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Domain driven design 使用持久函数,如何从活动函数返回多个值_Domain Driven Design_Azure Durable Functions - Fatal编程技术网

Domain driven design 使用持久函数,如何从活动函数返回多个值

Domain driven design 使用持久函数,如何从活动函数返回多个值,domain-driven-design,azure-durable-functions,Domain Driven Design,Azure Durable Functions,我是一个领域驱动的设计爱好者和开发者,我总是试图将技术/架构映射到DDD世界。将微服务映射到有边界的上下文可以实现自然婚姻。最后,我只想专注于我的业务逻辑,并在正确的环境中运行它。持久功能在我看来很有希望,因为如果愿意的话,需要跨微服务、Sagas或Process Manager解决分布式事务问题。我已经使用NServicebus多年了,我喜欢他们的Saga技术,但我想利用持久的功能编排来处理Saga逻辑。   我目前面临的架构问题如下。我已将DDD应用程序服务映射到活动函数。因此,只需编排器点

我是一个领域驱动的设计爱好者和开发者,我总是试图将技术/架构映射到DDD世界。将微服务映射到有边界的上下文可以实现自然婚姻。最后,我只想专注于我的业务逻辑,并在正确的环境中运行它。持久功能在我看来很有希望,因为如果愿意的话,需要跨微服务、Sagas或Process Manager解决分布式事务问题。我已经使用NServicebus多年了,我喜欢他们的Saga技术,但我想利用持久的功能编排来处理Saga逻辑。  
我目前面临的架构问题如下。我已将DDD应用程序服务映射到活动函数。因此,只需编排器点击一组正确的活动函数来运行它们的事务,就可以创建一个传奇。构建回滚在概念上也非常简单,但我遇到了一个实现问题。另一方面,每个活动函数将委托给一个处理所有业务逻辑详细信息的库,然后获取业务逻辑返回的事件列表,并将其返回给Orchestrator。据我所研究,没有办法从活动函数返回多态返回值。因此,如果我的业务逻辑生成UpdateSucceeded或UpdateFailed事件,我如何简单地将其从活动函数返回给编排器,以便编排器可以通过调用不同的回滚活动函数来采取纠正措施?

而您可能无法从活动返回多态结果,您是否考虑过返回可由编排器反序列化并相应处理的序列化值。这并不理想,但会让你有能力完成同样的任务

当然,在调用之前和之后添加序列化代码是可行的,但不是最优的。活动函数签名将失去其类型特异性。可行,但不是很优雅。

您可以在持久函数中使用新的自定义序列化程序支持来实现这一点。它仍然需要记录,但基本上是这样工作的,使用Azure功能:

公共类启动:函数启动
{
公共覆盖无效配置(IFunctionsHostBuilder)
{
builder.Services.AddSingleton();
}
}
公共类CustomMessageSerializer:IMessageSerializerSettingsFactory
{
公共JsonSerializerSettings CreateJsonSerializerSettings()
{
返回新的JsonSerializerSettings{TypeNameHandling=TypeNameHandling.All};
}
}
现在,如果您有这样的类:

公共抽象类东西
{
公共抽象字符串GetMessage();
}
公务舱富:事情
{
公共重写字符串GetMessage()
{
返回“我是个傻瓜”;
}
}
公共类酒吧:东西
{
公共重写字符串GetMessage()
{
返回“我是酒吧”;
}
}
您有如下编排和活动功能:

[FunctionName(nameof(Orchestrator))]
公共静态异步任务编排器(
[OrchestrationTrigger]IDurableOrchestrationContext(上下文)
{
变量输出=新列表();
Add((wait context.CallActivityAsync(nameof(GetThing),true)).GetMessage());
Add((wait context.CallActivityAsync(nameof(GetThing),false)).GetMessage());
//[“我是个傻瓜”,“我是个酒吧”]
返回输出;
}
[函数名(name of(GetThing))]
公共静态对象获取([ActivityTrigger]bool-isFoo,ILogger-log)
=>isFoo?新事物新事物新酒吧;

上述自定义序列化程序适用于持久函数扩展序列化的所有内容。如果需要更多的控制,您可以创建更复杂的序列化程序。

您对TypeNameHandling可能引入的漏洞有什么想法吗?我有一个从外部系统接收消息的持久功能。在允许抽象类可序列化的同时,有没有办法避免这种风险?