我已经将WebAPI添加到有状态序列化中,并希望从其中访问StateManager (从StatefulService类实现之外)。
做这件事最好的方法是什么?
目前,我正在使用一个小班来实现这个目标:
internal static class InstanceAccessor
{
internal static StatefulService ActiveInstance { get; set; }
}并将值放入StatefulService的StatefulService方法中:
protected override async Task RunAsync(CancellationToken cancellationToken)
{
InstanceAccessor.ActiveInstance = this;
...发布于 2017-02-05 09:12:36
您的服务可能会有多个并发调用访问共享实例,在代码中,在WebApi设置实例之前执行对RunAsync的请求是可能的(但不太可能)。您可以将任务转移到服务的.ctor。但是,由于它只是读取,所以在设置实例之后,您不需要担心冲突。
这个解决方案的问题是可测试性。如果您想为您的WebAPi编写单元测试,那么它将很难依赖于共享实例。有关此问题的更多信息,请参见此答案:单子单元测试
另一种适合您的方法是使用依赖项注入和IoC容器。您可以将您的WebApi控制器设置为由具有对所有依赖项(包括您的服务)的引用的容器构造的。可以为Service /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);
}但是,如果您只需要在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容器都可以工作。
https://stackoverflow.com/questions/42049901
复制相似问题