Разделить IObservable, а затем объединить после обработки?

2

После экспериментов с IObservables я решил протестировать их для обработки входящих сообщений по шине сообщений. По существу я получаю IObservable<Request>, а Request содержит необходимые функции для ответа на ответ.

В какой-то момент во время обработки я должен десериализовать данные и преобразовать их из объекта Request to the Command, который содержит то, что он действительно должен делать. Команда не связана с запросом.

После десериализации я преобразую его в правильный ответ, однако для отправки ответа мне нужен исходный объект Request. Я хочу попытаться достичь этого, сохраняя при этом высокую читаемость кода. До сих пор я использовал методы расширения и лямбда-выражения, чтобы получить следующее (где requests - IObservable<Request>):

requestProcessor = requests
            .Deserialize<IdentityRequest>()
            .Where(idRequest => idRequest.Address != null)
            .Select(idRequest => new IdentityResponse() {Identity = identityTable[idRequest.Address.Address]})
            .Serialize()
            .Zip(requests, (response, request) => new {request = request, response = response})
            .Subscribe(data => data.request.Respond(data.response, ObjectTypes.IdentityResponse));  

Мой вопрос в том, что все команды перед функцией Zip требуют времени для обработки, будет ли Zip работать на одном и том же объекте ввода (т.е. исходном входе, а также на отдельном обработанном вводе), если являются постоянным потоком сообщений. Как я могу проверить это?

Есть ли лучший способ сделать это?

  • 1
    Зависит от версии используемой вами платформы, здесь может помочь Tuples в 4.0.
Теги:
system.reactive

1 ответ

2
Лучший ответ

Я решил это удовлетворительно, но может быть лучший метод. Я создал монадический тип, который состоит из двух типов: значение, которое преобразует данные; и контекст, который является окружающими данными.

Это что-то вроде следующего:

 public class ComposedType<TValue, TContext>
 {
       public TValue Value { get; protected set; }
       public TContext Context { get; protected set; }

       public ComposedType(TValue value, TContext context)
       {
            Value = value;
            Context = context;
       }
  }

Я также определял неявные операторы как для контекста, так и для значения. Существуют также некоторые связанные методы расширения, которые позволяют вам преобразовать значение из одного типа в новый.

Если у кого-то есть лучший метод, хотя я приветствую альтернативы, и я собираюсь оставить это без ответа какое-то время.

  • 0
    Было бы проще (хотя и не обязательно более понятно ) использовать Tuple<T1, T2> сейчас.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню