访问 Azure Service Fabric 有状态服务状态

2024-04-25

我已将 Web API 添加到我的有状态服务并想要访问StateManager从它(从外面StatefulService类实现)。

最好的方法是什么?

目前我正在为此使用一个小类:

internal static class InstanceAccessor
{
   internal static StatefulService ActiveInstance { get; set; }
}

并将值放入 RunAsync 方法中StatefulService :

protected override async Task RunAsync(CancellationToken cancellationToken)
{
    InstanceAccessor.ActiveInstance = this;
    ...

您的服务可能会有多个并发调用访问共享实例,在您的代码中,有可能(但不太可能)在 RunAsync 设置实例之前执行对 WebApi 的请求。您可以将分配移至服务的 .ctor。但是,由于它只是读取您将对共享实例执行的操作,因此在设置实例后无需担心冲突。

该解决方案的问题是可测试性。如果你想为你的 WebAPI 编写单元测试,它将有一个hard对共享实例的依赖。有关于此的更多信息,请参阅此答案:使用单例进行单元测试 https://stackoverflow.com/questions/2085953/unit-testing-with-singletons

另一种适合您的方法是使用依赖注入和 IoC 容器。您可以将 WebApi 控制器设置为由引用所有依赖项(包括您的服务)的容器构建。可以按照此处所述为 Service Fabric/WebApi 设置 IoC 和依赖注入https://stackoverflow.com/a/41980513/1062217 https://stackoverflow.com/a/41980513/1062217。你只需要添加对你的依赖StatefulService在控制器中.ctor.

 public SomeApiController(StatefulService service)
 {
     _service = service;
 }

并在容器中注册服务

public WebApiService(StatefulServiceContext context)
    : base(context)
{
    Container = new TinyIoCContainer();
    Container.Register<StatefulService>(this);
}

然而,如果只是Statemanager如果您需要在 WebApi 控制器中使用,如果您只依赖于StateManager:

 public SomeApiController(IReliableStateManagerReplica stateManager)
 {
     _stateManager = stateManager;
 }

并在服务 .ctor 中注册:

public WebApiService(StatefulServiceContext context)
    : base(context)
{
    Container = new TinyIoCContainer();
    Container.Register<IReliableStateManagerReplica>(this.StateManager);
}

请注意,此示例使用 TinyIoC,但任何 IoC 容器都可以工作

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

访问 Azure Service Fabric 有状态服务状态 的相关文章

随机推荐