通过CorrelationId

时间:2018-09-18 21:13:26

标签: c# multithreading system.reactive

我正在尝试使用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.
             });
        }
    }

0 个答案:

没有答案