访问 Azure Service Fabric 有状态服务状态
Access Azure Service Fabric stateful service state
我已将 WebAPI 添加到我的有状态服务并希望从中访问 StateManager
(从 StatefulService
class 实施之外)。
最好的方法是什么?
目前我正在为此使用一个小的 class:
internal static class InstanceAccessor
{
internal static StatefulService ActiveInstance { get; set; }
}
并将值放入 StatefulService
的 RunAsync 方法中:
protected override async Task RunAsync(CancellationToken cancellationToken)
{
InstanceAccessor.ActiveInstance = this;
...
您的服务可能有多个访问共享实例的并发调用,在您的代码中,可能(但不太可能)在 RunAsync 设置实例之前执行对 WebApi 的请求。您可以将分配移至服务的 .ctor。但是,由于它只是读取您将对共享实例执行的操作,因此您无需担心在设置实例后发生冲突。
此解决方案的问题在于可测试性。如果你想为你的 WebAPI 编写单元测试,它将对共享实例有 hard 依赖。有关更多信息,请参阅此答案:Unit testing with singletons
另一种适合您的方法是使用依赖注入和 IoC 容器。您可以将 WebApi 控制器设置为由引用所有依赖项(包括您的服务)的容器构建。可以按照此处 的描述为服务 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
:[=20,您的实现将更容易测试和维护=]
public SomeApiController(IReliableStateManagerReplica stateManager)
{
_stateManager = stateManager;
}
并在服务 .ctor:
中注册
public WebApiService(StatefulServiceContext context)
: base(context)
{
Container = new TinyIoCContainer();
Container.Register<IReliableStateManagerReplica>(this.StateManager);
}
注意,此示例使用 TinyIoC,但任何 IoC 容器都可以工作
Github that shows a simple way to do it using dependency injection 上有一个示例项目。
我已将 WebAPI 添加到我的有状态服务并希望从中访问 StateManager
(从 StatefulService
class 实施之外)。
最好的方法是什么?
目前我正在为此使用一个小的 class:
internal static class InstanceAccessor
{
internal static StatefulService ActiveInstance { get; set; }
}
并将值放入 StatefulService
的 RunAsync 方法中:
protected override async Task RunAsync(CancellationToken cancellationToken)
{
InstanceAccessor.ActiveInstance = this;
...
您的服务可能有多个访问共享实例的并发调用,在您的代码中,可能(但不太可能)在 RunAsync 设置实例之前执行对 WebApi 的请求。您可以将分配移至服务的 .ctor。但是,由于它只是读取您将对共享实例执行的操作,因此您无需担心在设置实例后发生冲突。
此解决方案的问题在于可测试性。如果你想为你的 WebAPI 编写单元测试,它将对共享实例有 hard 依赖。有关更多信息,请参阅此答案:Unit testing with singletons
另一种适合您的方法是使用依赖注入和 IoC 容器。您可以将 WebApi 控制器设置为由引用所有依赖项(包括您的服务)的容器构建。可以按照此处 .ctor
.
StatefulService
的依赖
public SomeApiController(StatefulService service)
{
_service = service;
}
并在容器中注册服务
public WebApiService(StatefulServiceContext context)
: base(context)
{
Container = new TinyIoCContainer();
Container.Register<StatefulService>(this);
}
但是,如果它只是您在 WebApi 控制器中需要的 Statemanager
,如果您只依赖 StateManager
:[=20,您的实现将更容易测试和维护=]
public SomeApiController(IReliableStateManagerReplica stateManager)
{
_stateManager = stateManager;
}
并在服务 .ctor:
中注册public WebApiService(StatefulServiceContext context)
: base(context)
{
Container = new TinyIoCContainer();
Container.Register<IReliableStateManagerReplica>(this.StateManager);
}
注意,此示例使用 TinyIoC,但任何 IoC 容器都可以工作
Github that shows a simple way to do it using dependency injection 上有一个示例项目。