После экспериментов с 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
работать на одном и том же объекте ввода (т.е. исходном входе, а также на отдельном обработанном вводе), если являются постоянным потоком сообщений. Как я могу проверить это?
Есть ли лучший способ сделать это?
Я решил это удовлетворительно, но может быть лучший метод. Я создал монадический тип, который состоит из двух типов: значение, которое преобразует данные; и контекст, который является окружающими данными.
Это что-то вроде следующего:
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;
}
}
Я также определял неявные операторы как для контекста, так и для значения. Существуют также некоторые связанные методы расширения, которые позволяют вам преобразовать значение из одного типа в новый.
Если у кого-то есть лучший метод, хотя я приветствую альтернативы, и я собираюсь оставить это без ответа какое-то время.
Tuple<T1, T2>
сейчас.