Repositori ini berisi empat perpustakaan yang secara konseptual terkait karena semuanya berkaitan dengan LINQ atas urutan hal-hal:
Ekstensi Reaktif untuk .NET alias Rx.NET atau Rx (System.Reactive): pustaka untuk pemrograman berbasis peristiwa dengan model deklaratif yang dapat disusun
AsyncRx.NET (pratinjau eksperimental) (System.Reactive.Async): implementasi eksperimental Rx untuk IAsyncObservable<T>
menawarkan dukungan async
/ await
yang lebih dalam
Ekstensi Interaktif untuk .NET, alias Ix (System.Interactive): perluasan operator LINQ untuk IAsyncEnumerable
dan IEnumerable
LINQ untuk IAsyncEnumerable
(System.Linq.Async): mengimplementasikan operator LINQ standar untuk IAsyncEnumerable
Masing-masing akan dijelaskan nanti di README ini.
Pemrograman reaktif memberikan kejelasan kapan kode kita perlu merespons peristiwa. Pustaka Rx.NET dirancang untuk memungkinkan aplikasi cloud-native memproses data langsung dengan cara yang andal dan dapat diprediksi.
Kami telah menulis buku GRATIS yang menjelaskan abstraksi penting yang mendasari Rx, dan menunjukkan cara memanfaatkan fungsionalitas yang kuat dan ekstensif yang dibangun ke dalam perpustakaan Rx.NET.
Berdasarkan buku Lee Campbell tahun 2010 (dengan hormat disumbangkan untuk proyek ini), buku ini telah ditulis ulang agar tetap mutakhir dengan Rx.NET v6.0, .NET 8.0, dan kasus penggunaan cloud native modern seperti IoT dan real- pemrosesan data aliran waktu.
Pengenalan Rx.NET tersedia Online, di GitHub, dalam bentuk PDF, dan EPUB.
Saluran | Rx | AsyncRx | Ix | Sistem.Linq.Async |
---|---|---|---|---|
NuGet.org | ||||
Pratinjau NuGet.org (jika lebih baru dari rilis) | ||||
Membangun | Dibangun sebagai bagian dari Ix | |||
Biru langit Artefak | ||||
Riwayat rilis | RilisSejarah | RilisSejarah | RilisSejarah |
Untuk build malam hari, konfigurasikan NuGet untuk menggunakan umpan ini: https://pkgs.dev.azure.com/dotnet/Rx.NET/_packaging/RxNet/nuget/v3/index.json
Tangkap kami di saluran #rxnet di https://reactivex.slack.com/
Di era digital ini, aliran data langsung ada di mana-mana. Penerapan keuangan bergantung pada respons cepat terhadap informasi yang tepat waktu. Jaringan komputer selalu mampu memberikan informasi luas tentang kesehatan dan pengoperasiannya. Perusahaan utilitas seperti penyedia air memiliki banyak sekali perangkat yang memantau operasi mereka. Antarmuka pengguna dan kerangka pembuatan game melaporkan interaksi pengguna dengan sangat rinci. Van pengiriman terus melaporkan kemajuannya. Pesawat terbang menyediakan telemetri kinerja untuk mendeteksi potensi masalah pemeliharaan sebelum menjadi masalah serius, dan mobil kini mulai melakukan hal yang sama. Banyak dari kita memakai atau membawa perangkat yang melacak aktivitas fisik dan bahkan tanda-tanda vital kita. Dan peningkatan dalam pembelajaran mesin telah memperkaya wawasan yang dapat diperoleh dari volume dan variasi data langsung yang terus meningkat.
Namun meskipun tersebar luas, aliran informasi langsung selalu menjadi warga kelas dua. Hampir semua bahasa pemrograman mempunyai cara bawaan untuk bekerja dengan daftar data (misalnya array), namun mekanisme ini cenderung berasumsi bahwa data yang relevan sudah tersimpan di memori, siap untuk kita gunakan. Yang hilang adalah keaktifannya—fakta bahwa sumber informasi bisa menghasilkan data baru kapan saja, sesuai jadwalnya sendiri.
Rx meningkatkan dukungan untuk streaming informasi langsung ke tingkat yang sama seperti yang kami harapkan untuk hal-hal seperti array. Berikut ini contohnya:
var bigTrades = dari perdagangan dalam perdagangan di mana perdagangan.Volume > 1_000_000 pilih perdagangan;
Ini menggunakan fitur LINQ C# untuk memfilter trades
ke entitas yang volumenya lebih besar dari satu juta. Sintaks ekspresi kueri ini hanyalah singkatan dari pemanggilan metode, jadi kita juga dapat menuliskannya seperti ini:
var bigTrades = perdagangan.Di mana(perdagangan => perdagangan.Volume > 1_000_000);
Perilaku sebenarnya dari dua cuplikan kode (yang setara) ini bergantung pada jenis trades
yang dimilikinya. Jika itu adalah IEnumerable<Trade>
, maka kueri ini hanya akan mengulangi daftar, dan bigTrades
akan menjadi urutan enumerable yang hanya berisi objek yang cocok. Jika trades
adalah sebuah objek yang mewakili tabel database (misalnya, Entity Framework DbSet, maka ini akan diterjemahkan ke dalam query database. Namun jika kita menggunakan Rx, trades
akan menjadi IObservable<Trade>
, sebuah objek yang melaporkan kejadian langsung saat kejadian tersebut terjadi. terjadi. Dan bigTrades
juga akan menjadi IObservable<Trade>
, yang hanya melaporkan perdagangan dengan volume lebih dari satu juta. Kami dapat memberikan Rx panggilan balik untuk dipanggil setiap kali sumber yang dapat diamati melakukannya sesuatu untuk kami:
bigTrades.Subscribe(t => Console.WriteLine($"{t.Symbol}: berdagang dengan volume {t.Volume}"));
Dua fitur utama Rx adalah:
cara yang jelas untuk merepresentasikan dan menangani rangkaian data langsung ( IObservable<T>
)
sekumpulan operator (seperti operator Where
yang baru saja ditampilkan) yang memungkinkan logika pemrosesan peristiwa diekspresikan secara deklaratif
Rx telah berhasil diterapkan secara khusus di antarmuka pengguna. (Hal ini juga berlaku di luar .NET—RxJS adalah spin-off JavaScript dari Rx, dan sangat populer dalam kode antarmuka pengguna.) https://github.com/reactiveui/reactiveui memanfaatkan Rx secara mendalam untuk mendukung Pengembangan .NET UI.
Ian Griffiths menyajikan ikhtisar singkat 60 menit tentang Ekstensi Reaktif untuk .NET pada pertemuan dotnetsheff pada tahun 2020. Lebih banyak video tersedia di playlist Rx.
Meskipun Rx adalah cara alami untuk memodelkan proses asinkron, desain aslinya berasumsi bahwa kode yang bekerja pada notifikasi akan berjalan secara sinkron. Ini karena desain Rx mendahului fitur bahasa async
/ await
C#. Jadi meskipun Rx menawarkan adaptor yang dapat mengkonversi antara IObservable<T>
dan Task<T>
, ada beberapa kasus di mana async
bukanlah suatu pilihan.
AsyncRx.Net menghilangkan batasan ini dengan mendefinisikan IAsyncObservable<T>
. Hal ini memungkinkan pengamat untuk menggunakan kode asinkron. Misalnya, jika bigTrades
adalah IAsyncObservable<Trade>
kita dapat menulis ini:
bigTrades.Subscribe(async t => menunggu bigTradeStore.LogTradeAsync(t));
AsyncRx.Net saat ini sedang dalam pratinjau.
Rx mendefinisikan semua operator LINQ standar yang tersedia untuk penyedia lain, tetapi juga menambahkan banyak operator tambahan. Misalnya, ia mendefinisikan Scan
, yang melakukan pemrosesan dasar yang sama seperti operator Aggregate
standar, namun alih-alih menghasilkan satu hasil setelah memproses setiap elemen, ia menghasilkan urutan yang berisi nilai agregat setelah setiap langkah. (Misalnya, jika operasi yang digabungkan adalah penjumlahan, Aggregate
akan mengembalikan jumlah total sebagai output tunggal, sedangkan Scan
akan menghasilkan total berjalan untuk setiap input. Diberikan urutan [1,2,3]
, Aggregate((a, x) => a + x)
hanya menghasilkan 6
, sedangkan Scan
akan menghasilkan [1,3,6]
.)
Beberapa operator tambahan yang ditentukan Rx hanya berguna saat Anda bekerja dengan acara. Namun ada pula yang dapat diterapkan pada rangkaian apa pun. Jadi Ekstensi Interaktif (singkatnya Ix) mendefinisikan implementasi untuk IEnumerable<T>
. Ix secara efektif merupakan perpanjangan dari LINQ ke Objek, menambahkan banyak operator tambahan. (Kegunaannya dibuktikan oleh fakta bahwa perpustakaan runtime .NET, seiring berjalannya waktu, telah menambahkan beberapa operator yang dulunya hanya tersedia di Ix. Misalnya, .NET 6 menambahkan MinBy
dan MaxBy
, operator yang sebelumnya hanya ditentukan oleh Ix.)
Perpustakaan ini disebut "Ekstensi Interaktif" karena "Interaktif" adalah kebalikan dari "Reaktif". (Nama tidak mengacu pada interaksi pengguna.)
IAsyncEnumerable
( System.Linq.Async
) Salah satu fitur yang dipelopori oleh Ix adalah versi asynchronous dari IEnumerable<T>
. Ini adalah contoh lain dari fitur yang sangat berguna sehingga akhirnya ditambahkan ke pustaka runtime .NET: .NET Core 3.0 memperkenalkan IAsyncEnumerable<T>
, dan versi terkait C# (8.0) menambahkan dukungan intrinsik untuk antarmuka ini dengan konstruksi await foreach
.
Meskipun .NET Core 3.0 mendefinisikan IAsyncEnumerable<T>
, ia tidak menambahkan implementasi LINQ yang sesuai. Sedangkan IEnumerable<T>
mendukung semua operator standar seperti Where
, GroupBy
, dan SelectMany
, .NET tidak memiliki implementasi bawaan untuk IAsyncEnumerable<T>
. Namun, Ix telah menyediakan operator LINQ untuk versi prototipe IAsyncEnumerable<T>
sejak awal, jadi ketika .NET Core 3.0 dikirimkan, merupakan tugas yang relatif mudah untuk memperbarui semua operator LINQ yang ada agar dapat bekerja dengan IAsyncEnumerable<T>
resmi yang baru. IAsyncEnumerable<T>
.
Dengan demikian, paket System.Linq.Async NuGet telah dibuat, menyediakan implementasi LINQ ke Objects untuk IAsyncEnumerable<T>
agar sesuai dengan yang sudah ada di .NET untuk IEnumerable<T>
.
Karena semua kode yang relevan sudah menjadi bagian dari proyek Ix (dengan IAsyncEnumerable<T>
juga awalnya telah ditentukan oleh proyek ini), paket System.Linq.Async NuGet dibuat sebagai bagian dari proyek Ix.
Beberapa cara terbaik untuk berkontribusi adalah dengan mencoba berbagai hal, melaporkan bug, dan bergabung dalam percakapan desain.
Kloning sumbernya: git clone https://github.com/dotnet/reactive
Membangun, menguji, dan men-debug sumber
Bagaimana Berkontribusi
Permintaan tarik: Buka/Tutup
Mencari sesuatu untuk dikerjakan? Daftar masalah yang harus diperebutkan adalah awal yang baik.
Proyek ini telah mengadopsi kode etik yang diadaptasi dari Perjanjian Kontributor untuk memperjelas perilaku yang diharapkan dalam komunitas kita. Kode etik ini telah diadopsi oleh banyak proyek lainnya. Untuk informasi lebih lanjut lihat Kode Etik.
Proyek ini adalah bagian dari .NET Foundation bersama dengan proyek lain seperti .NET Runtime. .NET Foundation menyediakan proyek ini dengan infrastruktur DevOps untuk mengkompilasi, menguji, menandatangani, dan mengemas solusi kompleks ini yang memiliki lebih dari 100 juta unduhan. Hal ini juga menyediakan konservatori yang memungkinkan proyek berpindah dari satu pengelola ke pengelola lainnya, sehingga memungkinkan kesinambungan bagi masyarakat.
Orang-orang yang saat ini memelihara Rx adalah:
Ian Griffiths Hove, Inggris Blog Ian di endjin.com | Howard van Rooijen Winchester, Inggris Blog Howard di endjin.com |
Rx telah ada selama kurang lebih satu setengah dekade, jadi kami berutang banyak kepada penciptanya, dan banyak orang yang telah mengerjakannya sejak saat itu. Lihat AUTHORS.txt untuk daftar lengkap.
Sebagai bagian dari .NET Conf 2023, Ian Griffiths memberikan pembaruan tentang upaya memodernisasi Rx.NET untuk v6.0 dan rencana untuk memodernisasi Rx.NET untuk v7.0.
Untuk lebih jelasnya, simak pembahasan berikut ini:
Kemasan Rx.NET Masa Depan
Paket tingkat tinggi Rx.NET v6.0 & v7.0
Kami telah menetapkan peta jalan yang menjelaskan rencana jangka menengah kami untuk pengembangan Rx yang berkelanjutan. Diagram ini menggambarkan pandangan kami tentang platform tempat Rx digunakan, dan siklus hidup dukungan yang direncanakan untuk berbagai target berikut: