Redux 1.0.0
See the version list below for details.
dotnet add package Redux --version 1.0.0
NuGet\Install-Package Redux -Version 1.0.0
<PackageReference Include="Redux" Version="1.0.0" />
<PackageVersion Include="Redux" Version="1.0.0" />
<PackageReference Include="Redux" />
paket add Redux --version 1.0.0
#r "nuget: Redux, 1.0.0"
#:package Redux@1.0.0
#addin nuget:?package=Redux&version=1.0.0
#tool nuget:?package=Redux&version=1.0.0
Redux-мини для .NET
Это простая реализация "контейнера состояния" по мотивам Redux для JavaScript.
Что это?
Концептуально, собственно контейнер состояния представляет собой обычный IDictonary<string, object>, а управление этим контейнером осуществляется методами отдельного объекта Store (хранилище). Изящество решения в минимальном количестве этих методов. Собственно их буквально три:
public interface Store
{
void Dispatch(Message message);
IDictionary<string, object> GetState();
Action Subscribe(Action<Message> handler);
}
Метод Dispatch позволяет отправлять сообщения хранилищу контейнера. Метод GetState позволяет получить копию текущего контейнера состояния со всем содержимым. И метод Subscribe позволяет подписаться на событие отправки сообщения. При этом следует иметь в виду что уведомления о таких событиях хранилище отправляет только при обработке тех типов сообщений, о которых оно осведомлено.
Как настроить хранилище?
О каких же типах событий осведомлено хранилище? О тех, для которых разработчик реализовал редукторы и при настройке хранилища, передал эти редукторы в конструктор хранилища.
Минимальный процесс настройки хранилища, с использованием простейших штатных редукторов может выглядеть к примеру вот так:
List<Reducer> reducers = new List<Reducer>();
reducers.Add(new ReducerImpl("User"));
reducers.Add(new ReducerImpl("Group"));
reducers.Add(new ReducerImpl("EmailConfirmation"));
reducers.Add(new ExceptionReducerImpl());
Store store = new StoreImpl(reducers);
Как отправить сообщение?
Теперь можно отправлять хранилищу сообщения:
User payload = new User() {
Login = "jack",
Password = "P@ssw0rd"
};
Message message = new Message("User", payload);
store.Dispatch(message);
Что там в контейнере?
И получать копию содержимого контейнера:
IDictionary<string, object> state = store.GetState();
User user = state["User"] as User;
Реализация штатного редуктора ReducerImpl умеет просто обновлять содержимое ячейки контейнера с указанным при конструировании редуктора типом сообщения:
string type = "User";
Reducer reducer = new ReducerImpl(type);
После этого, если вы отправите хранилищу сообщение с типом "User", редуктор обновит значение, хранимое в ячейке контейнера с ключом "User", что было продемонстрировано в предыдущих фрагментах кода выше.
Как узнать об изменениях содержимого контейнера?
Как упоминалось ранее, хранилище умеет сообщать всем желающим об изменениях в контейнере. Чтобы начать получать уведомления об изменении необходимо подписаться на события отправки сообщений. В идеале, метод, подписывающийся на событие, должен иметь доступ к контейнеру состояний, посредством методов хранилища. Поэтому обработчик лучше описывать в отдельном классе, которому при конструировании передается экземпляр хранилища. Например так:
public class CustomHandler
{
private Store store;
public CustomHandler(Store store)
{
this.store = store;
}
public void Handle(Message message)
{
IDictionary<string, object> state = this.store.GetState();
/// Здесь кодируем необходимое поведение
}
}
Теперь можно подписать наш обработчик на события хранилища и код метода Handle будет вызываться всякий раз, когда кто-нибудь будет отправлять сообщение.
CustomHandler handler = new CustomHandler(store);
Action unsubscribe = store.Subscribe(handler.Handle);
Вызов метода Subscribe возвращает ссылку на метод, который позволяет отписаться от получения уведомлений об поступлении сообщения в хранилище.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
This package has no dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
First version