【问题标题】:Access Azure Service Fabric stateful service state访问 Azure Service Fabric 有状态服务状态
【发布时间】:2017-06-22 08:08:23
【问题描述】:

我已将 WebAPI 添加到我的有状态服务中,并希望从中访问 StateManager(从 StatefulService 类实现之外)。

最好的方法是什么?

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

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

并将值放入 StatefulService 的 RunAsync 方法中:

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

【问题讨论】:

    标签: c# azure azure-service-fabric service-fabric-stateful


    【解决方案1】:

    您的服务可能会有多个并发调用访问共享实例,在您的代码中,有可能(但不太可能)在 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 容器都可以工作

    【讨论】:

      【解决方案2】:

      Github 上有一个示例项目,显示了使用依赖项injection 的简单方法。

      【讨论】:

      • 此答案中的链接已失效。
      • 刚刚修复了它们。
      猜你喜欢
      • 2016-08-07
      • 1970-01-01
      • 2017-06-26
      • 2017-11-11
      • 2018-09-04
      • 2018-10-23
      • 1970-01-01
      • 2017-10-30
      • 2016-11-16
      相关资源
      最近更新 更多