سؤال

بعد تجربة 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;
       }
  }

لقد حددت أيضًا المشغلين الضمنين لكل من السياق والقيمة. هناك أيضًا بعض طرق التمديد المرتبطة بها التي تسمح لك بتحويل القيمة من نوع واحد إلى نوع جديد.

إذا كان لدى أي شخص طريقة أفضل على الرغم من أنني أرحب بدائل ، وسأترك هذا دون إجابة لفترة من الوقت.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top