هل سيكون هناك إضافات مثل IQueryable إلى Iobservable؟ (.NET RX)

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

  •  19-09-2019
  •  | 
  •  

سؤال

أطر Iobservable / IOBServer الجديدة في مكتبة System.Reactive القادمة .NET 4.0 مثيرة للغاية (انظر هذه و هذه حلقة الوصل).

قد يكون من السابق لأوانه التوقعات، ولكن هل سيكون هناك أيضا (لعدم وجود فترة أفضل) إطار يشبه IQueryable المدمج لهذه الواجهات الجديدة أيضا؟

ستكون حالة الاستخدام المحددة هي المساعدة في الأحداث المسبقة المعالجة في المصدر، بدلا من سلسلة المكالمات المستقبلة. على سبيل المثال، إذا كان لديك واجهة حدث "شاتي"، باستخدام Subscribe().Where(...) سوف تتلقى جميع الأحداث من خلال خط الأنابيب والعميل يقوم المرشح.

ما أتساءله هو إذا كان هناك شيء أقرب إلى iqueryablebableervable، حيث سيتم تجميع هذه الأساليب LINQ هذه في بعض "الذكية" Subscribe التنفيذ في مصدر. يمكنني أن أتخيل بعض هندسة خادم الشبكة التي يمكن أن تستخدم هذا الإطار. أو ماذا عن الوظيفة الإضافية إلى SQL Server (أو أي RDBMS لهذه المسألة) التي من شأنها أن تسمح برمز .NET لتلقي إشعارات بيانات جديدة (المشغلات في التعليمات البرمجية) وستحتاج إلى تلك الإخطارات التي يتم تصفيةها جانب الخادم.

هل كانت مفيدة؟

المحلول

حسنا، حصلت عليه في أحدث إصدار من RX، في شكل واجهة تسمى iqbservable. (وضوحا كما iqueryableberybsable). ترقبوا قناة 9 فيديو حول هذا الموضوع، في أوائل الأسبوع المقبل.

لوضع هذه الميزة قليلا، يجب على المرء أن يدرك هناك ثلاثة محاور متعامدة من المفاهيم إلى لغز RX / IX:

  • ماذا نموذج البيانات هو أنك تستهدف. نجد هنا نماذج القائمة على السحب مقابل الدفع. تعتمد علاقتهم على ثنائي. وبعد توجد التحولات بين تلك العوالم (مثل Tooumerable).
  • أين يمكنك تنفيذ العمليات التي تدفع استفساراتك (Sensu Lato). يحتاج بعض المشغلين إلى التزامن. هذا هو المكان الجدولة وواجهة ischeduler تأتي في. توجد المشغلين للقفز بين نطاقات التزامن (على سبيل المثال obsriveon).
  • كيف يحتاج تعبير الاستعلام إلى التنفيذ. إما Verbatim (IL) أو مترجمة (أشجار التعبير). تعتمد علاقتهم على التم المنزلية. وبعد التحويلات موجودة بين كل من التمثيلات (مثل أسكريها).

يتيح جميع واجهة IQBServable (وهي المزدوجة إلى IQueryable وتمثيل شجرة التعبير لاستعلام Iobservable) هي النقطة الأخيرة. في بعض الأحيان يخلط الناس عن فعل الترجمة الاستعلام ("كيف" التشغيل) مع حساب الجوانب ("حيث" للتشغيل). بينما عادة ما تفعل يترجم الاستعلامات في بعض اللغة المستهدفة (مثل WQL، PowerShell، DSQLs لخدمات الإعلام السحابية، وما إلى ذلك) و التحكم عن بعد لهم في بعض النظام المستهدف، يمكن فصل الشواغلين. على سبيل المثال، يمكنك استخدام تمثيل شجرة التعبير للقيام به محلي تحسين الاستعلام.

فيما يتعلق بالمخاوف الأمنية المحتملة، لا يختلف هذا عن القدرات القابلة للإعمر. عادة ما سوف يقوم المرء فقط عن لغة التعبير فقط وليس أي مشغلين "للتأثير الجانبي حقا" (مهما كان هذا يعني لغات أخرى غير الأصولية الوظيفية). على وجه الخصوص، تبقى عمليات الاشتراك وتشغيلها محليا وتخرجك من Monad Requeryable (وبالتالي تشغيل الترجمة، تماما كما يفعل Getenumerator في عالم IQueryable). كيف يمكنك عن بعد فعل الاشتراك شيء سأترك خيال القارئ.

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

نصائح أخرى

في حين أن هذا يبدو وكأنه احتمال مثير للاهتمام، سيكون لدي العديد من التحفظات حول تنفيذ هذا.

1) تماما كما لا يمكنك تسلسل تعبيرات Lambda غير تافهة تستخدمها IQueryable، ستكون تسلسل هذه من أجل RX بشكل مشابه. من المحتمل أنك تريد أن تكون قادرا على تسلسل Lambdas متعدد الخطوط وبيان كجزء من هذا الإطار. للقيام بذلك، من المحتمل أن تحتاج إلى تطبيق شيء مثل مشاريع الحيوانات الأليفة الأخرى Erik Meijer الأخرى - Dryad و Volta.

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

8 (الآن 10) سنوات في المستقبل: لقد تعثرت QACT (RXX السابق)، أ rx.net. مقدم مزود خادم TCP Requeryable تفاعلي هو الحل على "السؤال"

الخادم

Observable
    .Interval(TimeSpan.FromSeconds(1))
    .ServeQbservableTcp(new IPEndPoint(IPAddress.Loopback, 3205));

عميل

var datasourceAddress = new IPEndPoint(IPAddress.Loopback, 3205);
var datasource = new TcpQbservableClient<long>(datasourceAddress);

(
     from value in datasource.Query()
     //The code below is actually executed on the server
     where value <= 5 || value >= 8
     select value
)
.Subscribe(Console.WriteLine);

ما هو العقل تهب حول هذا هو أن العملاء يمكنهم أن يقولوا ما وكيف يريدون في كثير من الأحيان البيانات التي يتلقونها والخادم لا يزال لا يزال يحد منه والتحكم فيه عند، ومدى تكرار البيانات التي ترجعها.

لمزيد من المعلومات حول هذا https://github.com/rxdave/qactive.

آخر بلوق

https://sachabarbs.wordpress.com/2016/12/23/rx-over-the-wire/

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

يبدو، بناء على قناة جديدة مقابلة, ، سيكون هناك دعم LINQ ل IObserver/IObservable في BCL من .NET 4.

ومع ذلك، فستكون استعلامات نمط LinQ-To-Overly، لذلك في هذه المرحلة، لا تبدو وكأنها "اشتراك ذكي" كما وضعته. هذا الأمر فيما يتعلق بالتطبيقات الأساسية .NET 4. (من فهمي من المقابلة المذكورة أعلاه)

وقد قلت ذلك, ، قد يكون للإطار التفاعلي (RX) تطبيقات أكثر تفصيلا IObserver/IObservable, ، أو قد تكون قادرا على كتابة تمريرك Expression<Func...> ل Subscribe Paramaters ثم باستخدام شجرة التعبير من Func للاشتراك بطريقة أكثر ذكاء يناسب قناة الحدث التي تشترك فيها.

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