对于ServiceFabric有状态可靠服务:
我想将一个IReliableQueue注入ICommunicationListener(服务总线主题监听器),以便将长时间运行的任务排入队列以便在后台进行处理。
我最好在工厂方法重载中这样做:
protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
{
var commandQueue = StateManager.GetOrAddAsync<IReliableQueue<Command>>("commandbus").Result;
var topicListener = communicationListenerCtor(commandQueue);
return []{new ServiceReplicaListener(context => topicListener, ...));}
}
鉴于StateManager仅通过GetOrAddAsync方法提供对IReliableQueue的异步访问,并且工厂方法是同步的,这种方法对于温和地说是不正确的。
在RunAsync方法之外访问StateManager状态的正确方法是什么?
答案 0 :(得分:2)
你非常接近。您需要整个IReliableStateManager,而不仅仅是队列实例,因为您需要能够创建使用该队列的事务,并且该事务位于IReliableStateManager上。
所以只需将您的代码更改为:
protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
{
var topicListener = communicationListenerCtor(this.StateManager);
return []{new ServiceReplicaListener(context => topicListener, ...));}
}
答案 1 :(得分:0)
看看这个样本:
我意识到我的设计存在缺陷,因为我注入了IReliableQueue实例而不是IReliableStateManager。我现在从ICOMmunicationListener 实例方法中的StateManager中检索队列实例,而不是队列实例的构造函数注入。我明显地在ICommunicationListener构造函数中注入了IReliableStateManager。
不确定这是否是最佳做法模式,但这解决了我的问题。