يحتوي هذا المستودع على أربع مكتبات مرتبطة من الناحية المفاهيمية حيث تهتم جميعها بـ LINQ عبر تسلسل الأشياء:
الامتدادات التفاعلية لـ .NET والمعروفة أيضًا باسم Rx.NET أو Rx (System.Reactive): مكتبة للبرمجة المستندة إلى الأحداث مع نموذج تعريفي قابل للتركيب
AsyncRx.NET (معاينة تجريبية) (System.Reactive.Async): التنفيذ التجريبي لـ Rx لـ IAsyncObservable<T>
الذي يوفر دعمًا أعمق async
/ await
الامتدادات التفاعلية لـ .NET، والمعروفة أيضًا باسم Ix (System.Interactive): مشغلي LINQ الممتدين لـ IAsyncEnumerable
و IEnumerable
LINQ لـ IAsyncEnumerable
(System.Linq.Async): يطبق مشغلي LINQ القياسيين لـ IAsyncEnumerable
سيتم وصف كل منها لاحقًا في هذا الملف التمهيدي.
توفر البرمجة التفاعلية الوضوح عندما يحتاج الكود الخاص بنا إلى الاستجابة للأحداث. تم تصميم مكتبات Rx.NET لتمكين التطبيقات السحابية الأصلية من معالجة البيانات الحية بطرق موثوقة ويمكن التنبؤ بها.
لقد قمنا بتأليف كتاب مجاني يشرح التجريدات الحيوية التي تدعم Rx، ويوضح كيفية استغلال الوظائف القوية والواسعة المضمنة في مكتبات Rx.NET.
استنادًا إلى كتاب Lee Campbell لعام 2010 (الذي تم التبرع به للمشروع)، تمت إعادة كتابته لتحديثه مع Rx.NET v6.0 و.NET 8.0 وحالات الاستخدام السحابية الأصلية الحديثة مثل IoT وreal- معالجة بيانات التدفق الزمني.
مقدمة إلى Rx.NET متاحة عبر الإنترنت، على GitHub، بتنسيق PDF وEPUB.
قناة | آر إكس | AsyncRx | التاسع | System.Linq.Async |
---|---|---|---|---|
NuGet.org | ||||
معاينة NuGet.org (إذا كانت أحدث من الإصدار) | ||||
يبني | بنيت كجزء من التاسع | |||
أزور التحف | ||||
تاريخ الإصدار | تاريخ الإصدار | تاريخ الإصدار | تاريخ الإصدار |
بالنسبة للإصدارات الليلية، قم بتكوين NuGet لاستخدام هذا الموجز: https://pkgs.dev.azure.com/dotnet/Rx.NET/_packaging/RxNet/nuget/v3/index.json
تابعنا على قناة #rxnet على https://reactivex.slack.com/
في هذا العصر الرقمي، تتوفر تدفقات البيانات الحية في كل مكان. تعتمد التطبيقات المالية على الاستجابة السريعة للمعلومات في الوقت المناسب. لقد كانت شبكات الكمبيوتر دائمًا قادرة على توفير معلومات شاملة حول صحتها وعملها. تمتلك شركات المرافق، مثل مزودي المياه، أعدادًا كبيرة من الأجهزة التي تراقب عملياتها. تقوم واجهة المستخدم وأطر بناء الألعاب بالإبلاغ عن تفاعلات المستخدم بتفصيل كبير. تقوم شاحنات التسليم بالإبلاغ بشكل مستمر عن التقدم الذي تحرزه. توفر الطائرات قياس الأداء عن بعد لاكتشاف مشكلات الصيانة المحتملة قبل أن تصبح مشكلات خطيرة، وبدأت السيارات الآن في فعل الشيء نفسه. يرتدي الكثير منا أو يحمل أجهزة تتتبع نشاطنا البدني وحتى العلامات الحيوية. وقد أدت التحسينات في التعلم الآلي إلى إثراء الرؤى التي يمكن استخلاصها من الحجم المتزايد باستمرار وتنوع البيانات الحية.
ولكن على الرغم من انتشارها على نطاق واسع، إلا أن تدفقات المعلومات الحية كانت دائمًا بمثابة مواطن من الدرجة الثانية. تمتلك جميع لغات البرمجة تقريبًا طريقة فطرية للعمل مع قوائم البيانات (على سبيل المثال، المصفوفات)، لكن هذه الآليات تميل إلى افتراض أن البيانات ذات الصلة موجودة بالفعل في الذاكرة، وجاهزة لنا للعمل معها. ما نفتقده هو الحيوية، أي حقيقة أن مصدر المعلومات قد ينتج بيانات جديدة في أي لحظة، وفقًا لجدوله الزمني الخاص.
يرفع Rx دعم التدفقات المباشرة للمعلومات إلى نفس المستوى الذي نتوقعه لأشياء مثل المصفوفات. هنا مثال:
var bigTrades = من التداول في الصفقات حيث trade.Volume > 1_000_000 حدد التداول؛
يستخدم هذا ميزة LINQ الخاصة بـ C# لتصفية trades
وصولاً إلى تلك الكيانات التي يزيد حجمها عن مليون. إن بناء جملة تعبير الاستعلام هذا هو مجرد اختصار لاستدعاءات الطريقة، لذا يمكننا أيضًا كتابتها بهذه الطريقة:
فار bigTrades = trades.Where(trade => trade.Volume > 1_000_000);
يعتمد السلوك الدقيق لهذين المقتطفين (المكافئين) من التعليمات البرمجية على نوع trades
. إذا كان IEnumerable<Trade>
، فسيتم تكرار هذا الاستعلام من خلال القائمة، وستكون bigTrades
عبارة عن تسلسل قابل للتعداد يحتوي على الكائنات المطابقة فقط. إذا كانت trades
عبارة عن كائن يمثل جدول قاعدة بيانات (على سبيل المثال، Entity Framework DbSet، فسيتم ترجمته إلى استعلام قاعدة بيانات. ولكن إذا كنا نستخدم Rx، فستكون trades
IObservable<Trade>
، وهو كائن يقوم بالإبلاغ عن الأحداث المباشرة أثناء حدوثها ويمكن أن تكون bigTrades
أيضًا IObservable<Trade>
، حيث تُبلغ فقط عن تلك الصفقات التي يزيد حجمها عن مليون. يمكننا تزويد Rx برد اتصال ليتم استدعاؤه في كل مرة يمكن ملاحظتها المصدر لديه شيء بالنسبة لنا:
bigTrades.Subscribe(t => Console.WriteLine($"{t.Symbol}: تداول بحجم {t.Volume}"));
السمتان الرئيسيتان لـ Rx هما:
طريقة محددة بوضوح لتمثيل ومعالجة التسلسل المباشر للبيانات ( IObservable<T>
)
مجموعة من عوامل التشغيل (مثل عامل التشغيل Where
الموضح للتو) تتيح التعبير عن منطق معالجة الأحداث بشكل تعريفي
لقد تم تطبيق Rx بنجاح بشكل خاص في واجهات المستخدم. (وهذا صحيح أيضًا خارج نطاق .NET — حيث يعد RxJS أحد إصدارات JavaScript العرضية لـ Rx، وهو شائع جدًا في كود واجهة المستخدم.) يستخدم https://github.com/reactiveui/reactiveui استخدامًا عميقًا لـ Rx لدعم تطوير واجهة المستخدم .NET.
قدم إيان غريفيث نظرة عامة موجزة مدتها 60 دقيقة عن الامتدادات التفاعلية لـ .NET في لقاء dotnetsheff في عام 2020. يتوفر المزيد من مقاطع الفيديو على قائمة تشغيل Rx.
على الرغم من أن Rx هي طريقة طبيعية لنمذجة العمليات غير المتزامنة، إلا أن تصميمها الأصلي يفترض أن التعليمات البرمجية التي تعمل على الإشعارات ستعمل بشكل متزامن. وذلك لأن تصميم Rx يسبق ميزات لغة C# async
/ await
. لذلك على الرغم من أن Rx يقدم محولات يمكنها التحويل بين IObservable<T>
و Task<T>
، إلا أن هناك حالات معينة لم يكن فيها async
خيارًا.
يرفع AsyncRx.Net هذا القيد عن طريق تعريف IAsyncObservable<T>
. يتيح ذلك للمراقبين استخدام التعليمات البرمجية غير المتزامنة. على سبيل المثال، إذا كانت bigTrades
عبارة عن IAsyncObservable<Trade>
فيمكننا كتابة هذا:
bigTrades.Subscribe(async t => انتظار bigTradeStore.LogTradeAsync(t));
AsyncRx.Net قيد المعاينة حاليًا.
يحدد Rx جميع مشغلي LINQ القياسيين المتاحين لمقدمي الخدمات الآخرين، ولكنه يضيف أيضًا العديد من المشغلين الإضافيين. على سبيل المثال، يتم تعريف Scan
، الذي يقوم بنفس المعالجة الأساسية التي يقوم بها عامل Aggregate
القياسي، ولكن بدلاً من إنتاج نتيجة واحدة بعد معالجة كل عنصر، فإنه ينتج تسلسلاً يحتوي على القيمة المجمعة بعد كل خطوة واحدة. (على سبيل المثال، إذا كانت العملية التي يتم تجميعها عبارة عن عملية إضافة، فسيقوم Aggregate
بإرجاع المجموع الإجمالي كمخرج واحد، في حين أن Scan
سينتج إجماليًا قيد التشغيل لكل إدخال. وبالنظر إلى التسلسل [1,2,3]
, Aggregate((a, x) => a + x)
ينتج 6
فقط، بينما ينتج Scan
[1,3,6]
.)
تكون بعض عوامل التشغيل الإضافية التي يحددها Rx مفيدة فقط عند التعامل مع الأحداث. لكن بعضها ينطبق على تسلسلات من أي نوع. لذا فإن الامتدادات التفاعلية (Ix للاختصار) تحدد تطبيقات IEnumerable<T>
. يعد Ix امتدادًا فعليًا لـ LINQ للكائنات، مما يضيف العديد من العوامل الإضافية. (تتجلى فائدته في حقيقة أن مكتبات وقت تشغيل .NET أضافت، بمرور الوقت، بعض العوامل التي كانت متاحة فقط في Ix. على سبيل المثال، أضاف .NET 6 MinBy
و MaxBy
، وهما عوامل تم تحديدها سابقًا فقط بواسطة التاسع.)
تسمى هذه المكتبة "الامتدادات التفاعلية" لأن "التفاعلية" هي عكس "التفاعلية". (لا يشير الاسم إلى تفاعلات المستخدم.)
IAsyncEnumerable
( System.Linq.Async
) إحدى الميزات التي ابتكرها Ix كانت إصدارًا غير متزامن من IEnumerable<T>
. هذا مثال آخر لميزة مفيدة للغاية لدرجة أنها تمت إضافتها في النهاية إلى مكتبات وقت تشغيل .NET: قدم .NET Core 3.0 IAsyncEnumerable<T>
، وأضاف الإصدار المرتبط C# (8.0) دعمًا جوهريًا لهذه الواجهة من خلال بناء await foreach
الخاص بها .
على الرغم من أن .NET Core 3.0 قام بتعريف IAsyncEnumerable<T>
، إلا أنه لم يقم بإضافة أي تطبيق LINQ مطابق. في حين أن IEnumerable<T>
يدعم جميع العوامل القياسية مثل Where
و GroupBy
و SelectMany
، فإن .NET لا يحتوي على تطبيقات مضمنة لأي من هذه العوامل لـ IAsyncEnumerable<T>
. ومع ذلك، قدمت Ix مشغلي LINQ لإصدار النموذج الأولي الخاص بها من IAsyncEnumerable<T>
منذ البداية، لذلك عندما تم شحن .NET Core 3.0، كانت مهمة سهلة نسبيًا تحديث جميع مشغلي LINQ الحاليين للعمل مع IAsyncEnumerable<T>
الرسمي الجديد. IAsyncEnumerable<T>
.
وهكذا، تم إنشاء حزمة System.Linq.Async NuGet، مما يوفر تطبيق LINQ to Objects لـ IAsyncEnumerable<T>
لمطابقة الحزمة المضمنة بالفعل في .NET لـ IEnumerable<T>
.
نظرًا لأن كل التعليمات البرمجية ذات الصلة كانت بالفعل جزءًا من مشروع Ix (مع تعريف IAsyncEnumerable<T>
أيضًا في الأصل بواسطة هذا المشروع)، فقد تم إنشاء حزمة System.Linq.Async NuGet كجزء من مشروع Ix.
بعض أفضل الطرق للمساهمة هي تجربة الأشياء، وتسجيل الأخطاء، والانضمام إلى محادثات التصميم.
استنساخ المصادر: git clone https://github.com/dotnet/reactive
بناء واختبار وتصحيح المصادر
كيفية المساهمة
طلبات السحب: مفتوحة/مغلقة
تبحث عن شيء للعمل عليه؟ تعد قائمة المشكلات التي يمكن الاستيلاء عليها مكانًا رائعًا للبدء.
اعتمد هذا المشروع قواعد سلوك مقتبسة من ميثاق المساهم لتوضيح السلوك المتوقع في مجتمعنا. وقد تم اعتماد مدونة قواعد السلوك هذه من قبل العديد من المشاريع الأخرى. لمزيد من المعلومات، راجع مدونة قواعد السلوك.
يعد هذا المشروع جزءًا من .NET Foundation إلى جانب مشاريع أخرى مثل .NET Runtime. تزود مؤسسة .NET هذا المشروع بالبنية التحتية DevOps لتجميع هذا الحل المعقد واختباره وتوقيعه وتعبئته والذي تم تنزيله أكثر من 100 مليون. كما أنها توفر الوصاية التي تمكن المشروع من الانتقال من مشرف إلى مشرف، مما يتيح الاستمرارية للمجتمع.
الأشخاص الذين يحتفظون حاليًا بـ Rx هم:
إيان غريفيث هوف، المملكة المتحدة مدونة إيان على endjin.com | هوارد فان رويجين وينشستر، المملكة المتحدة مدونة هوارد على endjin.com |
لقد كانت Rx موجودة منذ ما يقرب من عقد ونصف من الزمن، لذلك نحن ندين بالكثير لمبدعيها، وللعديد من الأشخاص الذين عملوا عليها منذ ذلك الحين. راجع ملف AUTHORS.txt للحصول على القائمة الكاملة.
كجزء من .NET Conf 2023، قدم Ian Griffiths تحديثًا حول الجهود المبذولة لتحديث Rx.NET للإصدار 6.0 والخطط الخاصة بالإصدار 7.0.
لمزيد من المعلومات، راجع المناقشات التالية:
تغليف Rx.NET المستقبلي
خطة Rx.NET v6.0 وv7.0 عالية المستوى
لقد وضعنا خريطة طريق توضح خططنا متوسطة المدى للتطوير المستمر لـ Rx. يوضح هذا الرسم البياني رؤيتنا للأنظمة الأساسية التي يتم استخدام Rx عليها، ودورات حياة الدعم المخططة لهذه الأهداف المتنوعة: