您的服务可能会有多个并发调用访问共享实例,在您的代码中,有可能(但不太可能)在 RunAsync 设置实例之前执行对 WebApi 的请求。您可以将分配移至服务的 .ctor。但是,由于它只是读取,您将对共享实例执行操作,因此您无需担心设置实例后的冲突。
这个解决方案的问题是可测试性。如果您想为您的 WebAPi 编写单元测试,它将对共享实例具有 hard 依赖关系。有关更多信息,请参阅此答案:Unit testing with singletons
另一种可能对您有用的方法是使用依赖注入和 IoC 容器。您可以将 WebApi 控制器设置为由引用所有依赖项(包括您的服务)的容器构造。可以按照此处https://stackoverflow.com/a/41980513/1062217 的描述为 Service Fabric/WebApi 设置 IoC 和依赖注入。您只需要在控制器.ctor 中添加对StatefulService 的依赖即可。
public SomeApiController(StatefulService service)
{
_service = service;
}
并在容器中注册服务
public WebApiService(StatefulServiceContext context)
: base(context)
{
Container = new TinyIoCContainer();
Container.Register<StatefulService>(this);
}
但是,如果它只是您在 WebApi 控制器中需要的 Statemanager,那么如果您只依赖于 StateManager,您的实现将更容易测试和维护:
public SomeApiController(IReliableStateManagerReplica stateManager)
{
_stateManager = stateManager;
}
并在服务 .ctor 中注册:
public WebApiService(StatefulServiceContext context)
: base(context)
{
Container = new TinyIoCContainer();
Container.Register<IReliableStateManagerReplica>(this.StateManager);
}
注意,此示例使用 TinyIoC,但任何 IoC 容器都可以工作