访问Azure Service Fabric状态服务状态

时间:2017-02-05 08:17:12

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

我已将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;
    ...

2 个答案:

答案 0 :(得分:2)

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

此解决方案的问题是可测试性。如果要为WebAPi编写单元测试,它将对共享实例具有依赖关系。有关详情,请参阅此答案:Unit testing with singletons

另一种可行的方法是使用依赖注入和IoC容器。您可以将WebApi控制器设置为由引用所有依赖项(包括您的服务)的容器构造。为Service Fabric / WebApi设置IoC和依赖注入可以按照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);
}

但是,如果它只是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容器都可以使用

答案 1 :(得分:1)

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