Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure service fabric 在初始化期间,向ICommunicationListener注入服务结构状态管理器资源的正确方法是什么?_Azure Service Fabric_Service Fabric Stateful - Fatal编程技术网

Azure service fabric 在初始化期间,向ICommunicationListener注入服务结构状态管理器资源的正确方法是什么?

Azure service fabric 在初始化期间,向ICommunicationListener注入服务结构状态管理器资源的正确方法是什么?,azure-service-fabric,service-fabric-stateful,Azure Service Fabric,Service Fabric Stateful,对于ServiceFabric有状态可靠服务: 我想将IReliableQueue注入ICommunicationListener(服务总线主题Listener),以便将长时间运行的任务排队,以便在后台进行处理 我最好在工厂方法重载中执行此操作: protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners() { var commandQueue = StateMan

对于ServiceFabric有状态可靠服务:

我想将IReliableQueue注入ICommunicationListener(服务总线主题Listener),以便将长时间运行的任务排队,以便在后台进行处理

我最好在工厂方法重载中执行此操作:

protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
{
    var commandQueue = StateManager.GetOrAddAsync<IReliableQueue<Command>>("commandbus").Result;
    var topicListener = communicationListenerCtor(commandQueue);
    return []{new ServiceReplicaListener(context => topicListener, ...));}
}
protectedoverride IEnumerable CreateServiceReplicaListeners()
{
var commandQueue=StateManager.GetOrAddAsync(“commandbus”).Result;
var topicListener=通信侦听器(commandQueue);
返回[]{newServiceReplicaListener(上下文=>topicListener,…);}
}
鉴于StateManager仅通过GetOrAddAsync方法提供对IReliableQueue的异步访问,而factory方法是sync,因此这种方法不适合温和地说


在RunAsync方法之外访问StateManager状态的正确方法是什么?

您已经非常接近了。您需要整个IReliableStateManager,而不仅仅是队列实例,因为您需要能够创建事务来使用队列,而队列位于IReliableStateManager上

因此,只需将代码更改为:

protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
{
    var topicListener = communicationListenerCtor(this.StateManager);
    return []{new ServiceReplicaListener(context => topicListener, ...));}
}
protectedoverride IEnumerable CreateServiceReplicaListeners()
{
var topicListener=communicationListener(this.StateManager);
返回[]{newServiceReplicaListener(上下文=>topicListener,…);}
}

查看此示例:

我意识到我的设计有缺陷,因为我注入了IReliableQueue实例,而不是IReliableStateManager。现在,我在ICommunicationListenerinstance方法中从StateManager检索队列实例,而不是队列实例的构造函数注入。显然,我确实在ICommunicationListener构造函数中注入了IReliableStateManager


不确定这是否是最佳实践模式,但这解决了我的问题

链接现在已断开