对于ServiceFabric有状态ReliableService:
我想向ICommunicationListener (服务总线主题侦听器)注入一个IReliableQueue,以便将长时间运行的任务排入队列,以便在后台进行处理。
我更喜欢在工厂方法重载中这样做:
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的异步访问,而工厂方法是sync,这种方法说得委委点是不正确的。
在RunAsync方法之外访问StateManager状态的正确方法是什么?
发布于 2017-03-29 02:30:12
你已经很接近了。您需要整个IReliableStateManager,而不仅仅是queue实例,因为您需要能够创建事务才能使用队列,它位于IReliableStateManager上。
所以只需将您的代码更改为:
protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
{
var topicListener = communicationListenerCtor(this.StateManager);
return []{new ServiceReplicaListener(context => topicListener, ...));}
}发布于 2017-03-29 02:31:16
查看此示例:
我意识到我的设计有缺陷,因为我注入的是IReliableQueue实例,而不是IReliableStateManager。现在,我从ICommunicationListener 实例方法的StateManager中检索队列实例,而不是队列实例的构造函数注入。显然,我确实在ICommunicationListener构造函数中注入了IReliableStateManager。
不确定这是否是最佳实践模式,但这解决了我的问题。
https://stackoverflow.com/questions/43076921
复制相似问题