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

StackOverflow https://stackoverflow.com/questions/2121773

  •  22-09-2019
  •  | 
  •  

Вопрос

После экспериментов с iobServables я решил проверить их на обработку входящих сообщений через автобус. По сути я получаю IObservable<Request> и 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 Работайте на том же входном объекте (т.е. исходный вход, а также на отдельном обработанном входе), если существует постоянный поток сообщений. Как я могу это проверить?

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

Это было полезно?

Решение

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

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

 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;
       }
  }

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top