El estator es un experimento simple, orientado, orientado, inspirado en Redux o Model-View-Update (MVU) usando C# 9.0. Funciona bien con Blazor y MobileBlazorbindings, incluidos los estados compartidos entre la parte Xamarin y la parte de Blazor de una aplicación móvil híbrida. También debe funcionar con cualquier otro modelo de cliente .NET Stateful.
A partir de 2021-04-08, el proyecto no admite .NET Standard 2.0, solo .NET 5+
Este proyecto usa:
| Nombre | Nuget.org | Feedz.io |
|---|---|---|
dotnet add package StateR | ||
dotnet add package StateR.Blazor | ||
dotnet add package StateR.Blazor.Experiments | ||
dotnet add package StateR.Experiments |
El siguiente fragmento representa una característica, que rodea un contador, donde puede Increment , Decrement y Set el valor de la propiedad Count de ese Counter.State . El fragmento también incluye el InitialState de ese contador.
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 } ;
}
}
} Luego, desde un componente Blazor que hereda de StatorComponent , podemos enviar esas acciones.
@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 >No es necesario heredar de
StatorComponent, un componente (o cualquier clase) puede suscribirse manualmente a cualquierIState<T>.
Jugué con algunas otras bibliotecas y no estaba 100% satisfecho con cómo hicieron las cosas. Entonces, mientras jugaba con MobileBlazorbindings y las nuevas aplicaciones híbridas, descubrí que los registros de C# 9 eran una gran opción para esto. Comencé a experimentar con la transformación de tipos inmutables (registros) y terminé creando este proyecto.
El nombre StateR , pronunciado Stator , está inspirado en MediatR que inicialmente se usó debajo del capó para mediar los comandos.
El estator es la parte estacionaria de un sistema rotativo [...]. La energía fluye a través de un estator hacia o desde el componente giratorio del sistema.
Fuente: Wikipedia
Después de escucharlo durante años, leí al respecto y encontré el concepto brillante, experimenté con él y adopté la idea.
Esta biblioteca se basa en los conceptos introducidos por Redux, pero .NET no es JavaScript y .NET Core se basa en la inyección de dependencia (DI), por lo que decidí aprovechar eso.
No hay tipo y ningún DI real en JavaScript, por lo que tiene sentido que la gente allí no lo haya tenido en cuenta cuando construyeron Redux.
Basé la implementación de Redux DevTools en Fluxor, que es un proyecto similar, que utilicé una vez. Eso me ayudó a reducir el tiempo de implementación para conectar el estator con Redux Devtools; gracias.
...
Abra un problema y sea lo más claro posible; ¿Ves cómo contribuir? Para más información.
Si desea contribuir al proyecto, primero, gracias por su interés y lea contribuyendo a los proyectos de código abierto de Forevolve para obtener más información.
Además, lea el Código de Conducta del Pacto de contribuyente que se aplica a todos los repositorios previos.
dotnet test /p:CollectCoverage=true => Cobreage.json
dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura => Cobertura.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