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