我发现ServiceRuntime.RegisterServiceAsync 在实际注册服务并作为参数传递的工厂Func完成之前返回是非常不直观的。
请考虑需要解析与注册相同的ServiceName的方案。您只能从在serviceFactory Func中获得的ServiceContext中获得ServiceName。您认为一旦获得上下文,便可以在serviceFactory Func中解决。但是,然后您输入一个“死锁”,因为它等待您注册的服务完成,所以解析调用将永远卡住。
这就是为什么我希望RegisterServiceAsync仅在serviceFactory Func也完成之后才能完成。
答案 0 :(得分:2)
由于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。