O Stator é um experimento simples, orientado, inspirado no Redux ou Model-View-update (MVU) usando C# 9.0. Funciona bem com o Blazor e o MobileBlazorbindings, incluindo o compartilhamento de estados entre a parte da Xamarina e a parte do Blazor de um aplicativo móvel híbrido. Também deve funcionar com qualquer outro modelo de cliente .NET Stateful.
A partir de 2021-04-08, o projeto não suporta .NET Standard 2.0, apenas .NET 5+
Este projeto usa:
| Nome | Nuget.org | feedz.io |
|---|---|---|
dotnet add package StateR | ||
dotnet add package StateR.Blazor | ||
dotnet add package StateR.Blazor.Experiments | ||
dotnet add package StateR.Experiments |
O snippet a seguir representa um recurso, ao redor de um contador, onde você pode Increment , Decrement e Set o valor da propriedade Count desse Counter.State . O snippet também inclui o InitialState desse 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 } ;
}
}
} Em seguida, de um componente blazor que herda do StatorComponent , podemos despachar essas ações.
@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 >Não é necessário herdar do
StatorComponent, um componente (ou qualquer classe) pode assinar manualmente qualquerIState<T>.
Eu brinquei com algumas outras bibliotecas e não fiquei 100% satisfeito com a maneira como eles fizeram coisas. Então, enquanto brincava com o MobileBlazorbindings e os novos aplicativos híbridos, descobri que os registros C# 9 eram um ótimo ajuste para isso. Comecei a experimentar a transformação de tipos imutáveis (registros) e acabei criando este projeto.
O Nome StateR , pronunciado Stator , é inspirado pelo MediatR que foi inicialmente usado sob o capô para mediar os comandos.
O estator é a parte estacionária de um sistema rotativo [...]. A energia flui através de um estator de ou para o componente rotativo do sistema.
Fonte: Wikipedia
Depois de ouvir sobre isso por anos, li sobre isso e achei o conceito brilhante, experimentei com ele e adotei a idéia.
Essa biblioteca é baseada nos conceitos introduzidos pelo Redux, mas o .NET não é JavaScript e .NET Core é construído em torno da injeção de dependência (DI), então decidi tirar proveito disso.
Não há tipo e nenhum di -JavaScript, por isso faz sentido que as pessoas não tenham levado isso em consideração quando construíram o Redux.
Eu baseei a implementação do Redux DevTools no Fluxor, que é um projeto semelhante, que eu usei uma vez. Isso me ajudou a diminuir o tempo de implementação para conectar o Stator com o Redux DevTools; obrigado.
...
Por favor, abra um problema e seja o mais claro possível; Veja como contribuir? Para mais informações.
Se você deseja contribuir com o projeto, primeiro, obrigado pelo seu interesse e leia contribuindo para projetar projetos de código aberto para obter mais informações.
Além disso, leia o Código de Conduta do Covenant colaborador que se aplica a todos os repositórios da Forevolve.
dotnet test /p:CollectCoverage=true => cobertura.json
dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura => cobertura.cobertu.xml
dotnet test --collect:"XPlat Code Coverage" => TestResults/{Guid} /coverage.cobertu.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