تقسيم iobservable ثم الجمع بعد المعالجة؟
-
22-09-2019 - |
سؤال
بعد تجربة IOBServables ، قررت اختبارها لمعالجة الرسائل الواردة عبر ناقل الرسائل. في الأساس أحصل على IObservable<Request>
و ال Request
يحتوي على الوظائف اللازمة للرد على الاستجابة.
في مرحلة ما أثناء المعالجة ، يجب أن أخرج البيانات وتحويلها من طلب إلى كائن أمر يحتوي على ما يحتاج إليه بالفعل. الأمر غير مرتبط بالطلب.
بعد إلغاء التخلص منه ، أقوم بتحويله إلى الاستجابة المناسبة ، ولكن من أجل إرسال الاستجابة ، أحتاج إلى كائن الطلب الأصلي. أريد أن أحاول تحقيق ذلك مع الحفاظ على قابلية قراءة الكود العالية. لقد استخدمت حتى الآن طرق التمديد وتعبيرات Lambda للحصول على ما يلي (حيث 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;
}
}
لقد حددت أيضًا المشغلين الضمنين لكل من السياق والقيمة. هناك أيضًا بعض طرق التمديد المرتبطة بها التي تسمح لك بتحويل القيمة من نوع واحد إلى نوع جديد.
إذا كان لدى أي شخص طريقة أفضل على الرغم من أنني أرحب بدائل ، وسأترك هذا دون إجابة لفترة من الوقت.