首页 > 解决方案 > 为什么 ServiceRuntime.RegisterServiceAsync 在 serviceFactory 函数完成之前返回?

问题描述

我发现ServiceRuntime.RegisterServiceAsync在服务实际注册并且作为参数传递的工厂 Func 完成之前返回非常不直观。

考虑一下您需要解析您正在注册的同一个 ServiceName 的场景。您只能从您在 serviceFactory Func 中获得的 ServiceContext 中获取 ServiceName。一旦获得上下文,您会认为可以在 serviceFactory Func 中解决。但是随后您进入了一个“死锁”,其中 resolve 调用将永远卡住,因为它等待您注册的服务完成。

这就是为什么我希望 RegisterServiceAsync 也只有在 serviceFactory Func 完成后才能完成。

标签: azure-service-fabric

解决方案


它在方法运行之前返回,因为ServiceRuntime.RegisterServiceAsync()它是工厂注册,而不是构建服务的构造函数。

签名:

public Task RegisterStatefulServiceFactoryAsync(string serviceTypeName, IStatefulServiceFactory factory, TimeSpan timeout, CancellationToken cancellationToken)

这里的概念是告诉运行时,每当运行时需要启动一个实例时,serviceTypeName它应该调用factory Func<System.Fabric.StatefulServiceContext,Microsoft.ServiceFabric.Services.Runtime.StatefulServiceBase>. 这个工厂是负责设置该服务所需的依赖项的函数,如果你需要进行依赖注入,你会在这一点上做。

运行时首先需要在开始构建服务之前注册依赖项。与添加依赖项注册时在 ASPNET 上所做的非常相似,并且一旦注册了所有依赖项,就调用Start().

稍后,运行时将准备就绪,并将接收来自 SF 的指令以从特定服务类型启动实际服务实例,此时将调用这些工厂并构建上下文。如果您需要在实际收到呼叫之前知道serviceTypeName ,那将是先有鸡还是先有蛋的困境。

它以这种方式工作,因为您可以在同一主机上运行多个副本,因此每个实例都有自己的上下文。您还可以在同一主机上拥有多个 serviceType。


推荐阅读