Le stator est une expérience simple, orientée vers la di-orientée, d'inspiration redux ou de vue de modèle de modèle (MVU) en utilisant C # 9.0. Il fonctionne bien avec Blazor et MobileBlazorbindings, notamment le partage des États entre la partie Xamarin et la partie Blazor d'une application mobile hybride. Il devrait également fonctionner avec tout autre modèle client .NET Stateful.
En 2021-04-08, le projet ne prend pas en charge .NET Standard 2.0, seulement .NET 5+
Ce projet utilise:
| Nom | Nuget.org | Feedz.io |
|---|---|---|
dotnet add package StateR | ||
dotnet add package StateR.Blazor | ||
dotnet add package StateR.Blazor.Experiments | ||
dotnet add package StateR.Experiments |
L'extrait suivant représente une fonctionnalité, entourant un compteur, où vous pouvez Increment , Decrement et Set la valeur de la propriété Count de cet Counter.State . L'extrait comprend également le InitialState de ce comptoir.
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 } ;
}
}
} Ensuite, à partir d'un composant Blazor qui hérite de StatorComponent , nous pouvons envoyer ces actions.
@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 >Il n'est pas nécessaire de hériter de
StatorComponent, un composant (ou n'importe quelle classe) peut s'abonner manuellement à n'importe quelIState<T>.
J'ai joué avec quelques autres bibliothèques et je n'étais pas satisfait à 100% de la façon dont ils ont fait des trucs. Ainsi, en jouant avec MobileBlazorbindings et les nouvelles applications hybrides, j'ai constaté que les disques C # 9 étaient très adaptés à cela. J'ai commencé à expérimenter la transformation des types immuables (enregistrements) et j'ai fini par créer ce projet.
Le nom StateR , prononcé Stator , est inspiré par MediatR qui a été initialement utilisé sous le capot pour médier les commandes.
Le stator est la partie stationnaire d'un système rotatif [...]. L'énergie traverse un stator vers ou depuis la composante rotative du système.
Source: Wikipedia
Après en entendre parler pendant des années, je l'ai lu à ce sujet et j'ai trouvé le concept brillant, j'ai expérimenté et adopté l'idée.
Cette bibliothèque est basée sur les concepts introduits par Redux, mais .NET n'est pas JavaScript et .NET Core est construit autour de l'injection de dépendance (DI), j'ai donc décidé d'en profiter.
Il n'y a pas de type et pas de vrai DI dans JavaScript, il est donc logique que les gens n'y aient pas pris en compte lorsqu'ils ont construit Redux.
J'ai basé l'implémentation Redux Devtools sur Fluxor, qui est un projet similaire, que j'ai utilisé une fois. Cela m'a aidé à réduire le temps d'implémentation pour connecter le stator avec Redux Devtools; merci.
...
Veuillez ouvrir un problème et être aussi clair que possible; Voyez comment contribuer? pour plus d'informations.
Si vous souhaitez contribuer au projet, merci d'abord pour votre intérêt, et veuillez lire en contribuant à prévenir les projets open source pour plus d'informations.
Veuillez également lire le Code de conduite de l'alliance des contributeurs qui s'applique à tous les référentiels de précaution.
dotnet test /p:CollectCoverage=true => couverture.json
dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura => Coverage.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