Stator adalah eksperimen sederhana, berorientasi di-berorientasi, terinspirasi redux atau model-view-update (MVU) menggunakan C# 9.0. Ini bekerja dengan baik dengan Blazor dan MobileBlazorbindings, termasuk berbagi keadaan antara bagian Xamarin dan bagian Blazor dari aplikasi seluler hybrid. Ini juga harus bekerja dengan model klien .NET stateful lainnya.
Pada 2021-04-08, proyek ini tidak mendukung .NET Standard 2.0, hanya .NET 5+
Proyek ini menggunakan:
| Nama | Nuget.org | feedz.io |
|---|---|---|
dotnet add package StateR | ||
dotnet add package StateR.Blazor | ||
dotnet add package StateR.Blazor.Experiments | ||
dotnet add package StateR.Experiments |
Cuplikan berikut mewakili fitur, mengelilingi penghitung, di mana Anda dapat Increment , Decrement , dan Set nilai properti Count dari Counter.State itu. Cuplikan juga menyertakan InitialState konter itu.
services
. AddStateR ( appAssembly )
. AddAsyncOperations ( ) // Add support for Redux thunk-like helpers
. AddReduxDevTools ( ) // Add support for Redux DevTools
. Apply ( )
; using StateR ;
namespace BlazorMobileHybridExperiments . Features
{
public class Counter
{
public record State ( int Count ) : StateBase ;
public class InitialState : IInitialState < State >
{
public State Value => new State ( 0 ) ;
}
public record Increment : IAction ;
public record Decrement : IAction ;
public class Reducers : IReducer < State , Increment > , IReducer < State , Decrement >
{
public State Reduce ( State state , Increment action ) => state with { Count = state . Count + 1 } ;
public State Reduce ( State state , Decrement action ) => state with { Count = state . Count - 1 } ;
}
}
} Kemudian dari komponen Blazor yang mewarisi dari StatorComponent , kita dapat mengirim tindakan itu.
@page "/counter"
@inherits StateR . Blazor . StatorComponent
@inject IState < Features . Counter . State > CounterState
< h1 > Counter < / h1 >
< p > Current count : @CounterState . Current . Count < / p >
< button class = "btn btn-primary" @onclick = "@(async () => await DispatchAsync(new Features.Counter.Increment()))" > + < / button >
< button class = "btn btn-primary" @onclick = "@(async () => await DispatchAsync(new Features.Counter.Decrement()))" > - < / button >Tidak diperlukan untuk mewarisi dari
StatorComponent, komponen (atau kelas apa pun) dapat secara manual berlangganan keIState<T>.
Saya bermain -main dengan beberapa perpustakaan lain dan saya tidak 100% puas dengan cara mereka melakukan hal -hal. Jadi saat bermain -main dengan MobileBlazorBindings dan aplikasi hybrid baru, saya menemukan bahwa catatan C# 9 sangat cocok untuk ini. Saya mulai bereksperimen dengan mengubah tipe immutable (catatan) dan akhirnya membuat proyek ini.
Nama StateR , diucapkan Stator , terinspirasi oleh MediatR yang awalnya digunakan di bawah kap untuk memediasi perintah.
Stator adalah bagian stasioner dari sistem putar [...]. Energi mengalir melalui stator ke atau dari komponen rotasi sistem.
Sumber: Wikipedia
Setelah mendengarnya selama bertahun -tahun, saya membacanya dan menemukan konsep yang brilian, bereksperimen dengannya, dan mengadopsi gagasan itu.
Perpustakaan ini didasarkan pada konsep yang diperkenalkan oleh Redux, tetapi .NET bukan JavaScript dan .NET Core dibangun di sekitar Injeksi Ketergantungan (DI), jadi saya memutuskan untuk memanfaatkannya.
Tidak ada jenis dan tidak ada di JavaScript, jadi masuk akal bahwa orang -orang di sana tidak memperhitungkannya ketika mereka membangun Redux.
Saya mendasarkan implementasi Redux DevTools pada Fluxor, yang merupakan proyek serupa, yang saya gunakan sekali. Itu membantu saya menurunkan waktu implementasi untuk menghubungkan stator dengan redux devtools; terima kasih.
...
Buka masalah dan sejelas mungkin; Lihat bagaimana berkontribusi? Untuk informasi lebih lanjut.
Jika Anda ingin berkontribusi pada proyek, pertama, terima kasih atas minat Anda, dan silakan baca berkontribusi untuk Forevolve Proyek Sumber Terbuka untuk informasi lebih lanjut.
Juga, silakan baca Kode Etik Perjanjian Kontributor yang berlaku untuk semua repositori Forvolve.
dotnet test /p:CollectCoverage=true => cakupan.json
dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura => cakupan.cobertura.xml
dotnet test --collect:"XPlat Code Coverage" => testResults/{guid} /coverage.cobertura.xml
dotnet tool install -g dotnet-reportgenerator-globaltool
reportgenerator -reports:coverage.cobertura.xml -targetdir:coveragereport -reporttypes:Html
dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura
reportgenerator " -reports:test**coverage.cobertura.xml " -targetdir:coveragereport -reporttypes:Html