我正在尝试使用RX.NET编写类似于Sagas的内容。我遇到了一个简单的问题,我不知道通过关联ID同步状态的最佳方法是什么。我有一个简单的EventAggregator,它侦听一些事件,并且可以从多个线程中进行通知,因此我不能假定总是在同一线程上调用订阅,因此,第一个通知将更新状态,与此同时另一个通知将接收旧状态并使用它,因此我必须对其进行同步。我将我的情况简化为如下所示。我可以通过某些对象ID来锁定整个订阅,但这似乎不正确。 RX的处理方式是什么?
public interface IEventAggregator
{
IObservable<T> GetEvent<T>() where T : Event;
}
public class EventAggregator : IEventAggregator
{
Subject<Event> _sub = new Subject<Event>();
public IObservable<T> GetEvent<T>() where T : Event
{
return _sub.OfType<T>();
}
public void Notify<T>(T ev) where T : Event
{
_sub.OnNext(ev);
}
}
public class Event
{
public string CorrelationId { get; set; }
}
public class State
{
public int SomeValue { get; set; }
}
public interface IStateRepository
{
State Get(string id);
}
public class ProcessManager
{
private readonly IStateRepository _stateRepository;
private readonly IEventAggregator _eventAggregator;
public ProcessManager(IStateRepository stateRepository, IEventAggregator eventAggregator)
{
_stateRepository = stateRepository;
_eventAggregator = eventAggregator;
eventAggregator.GetEvent<Event>()
.Select(x => _stateRepository.Get(x.CorrelationId))
.Subscribe(state =>
{
// -do something with state like write or read;
// - state should be unique per correlation id.
// - this block should be synchronized.
});
}
}