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" />
paket add Redux --version 1.0.0
#r "nuget: Redux, 1.0.0"
// Install Redux as a Cake Addin #addin nuget:?package=Redux&version=1.0.0 // Install Redux as a Cake Tool #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. |
.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