首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问Azure Service Fabric有状态服务状态

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

Stack Overflow用户
提问于 2017-02-05 08:17:12
回答 2查看 717关注 0票数 3

我已经将WebAPI添加到有状态序列化中,并希望从其中访问StateManager (从StatefulService类实现之外)。

做这件事最好的方法是什么?

目前,我正在使用一个小班来实现这个目标:

代码语言:javascript
复制
internal static class InstanceAccessor
{
   internal static StatefulService ActiveInstance { get; set; }
}

并将值放入StatefulServiceStatefulService方法中:

代码语言:javascript
复制
protected override async Task RunAsync(CancellationToken cancellationToken)
{
    InstanceAccessor.ActiveInstance = this;
    ...
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-06 07:22:39

Github上有一个示例项目,它展示了一种使用依赖注入来实现它的简单方法。

票数 1
EN

Stack Overflow用户

发布于 2017-02-05 09:12:36

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

这个解决方案的问题是可测试性。如果您想为您的WebAPi编写单元测试,那么它将很难依赖于共享实例。有关此问题的更多信息,请参见此答案:单子单元测试

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

代码语言:javascript
复制
 public SomeApiController(StatefulService service)
 {
     _service = service;
 }

并在容器中注册服务。

代码语言:javascript
复制
public WebApiService(StatefulServiceContext context)
    : base(context)
{
    Container = new TinyIoCContainer();
    Container.Register<StatefulService>(this);
}

但是,如果您只需要在Statemanager控制器中使用WebApi,那么如果您只依赖于StateManager,那么您的实现将更容易测试和维护。

代码语言:javascript
复制
 public SomeApiController(IReliableStateManagerReplica stateManager)
 {
     _stateManager = stateManager;
 }

并在服务.ctor中注册:

代码语言:javascript
复制
public WebApiService(StatefulServiceContext context)
    : base(context)
{
    Container = new TinyIoCContainer();
    Container.Register<IReliableStateManagerReplica>(this.StateManager);
}

注意,这个示例使用TinyIoC,但是任何IoC容器都可以工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42049901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档