Redux 1.0.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package Redux --version 1.0.0
NuGet\Install-Package Redux -Version 1.0.0
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Redux" Version="1.0.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Redux --version 1.0.0
#r "nuget: Redux, 1.0.0"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// 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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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.

Version Downloads Last updated
1.0.11 1,056 11/7/2019
1.0.10 441 11/3/2019
1.0.9 465 11/3/2019
1.0.6 641 7/7/2019
1.0.5 501 7/6/2019
1.0.3 498 7/2/2019
1.0.2 504 6/24/2019
1.0.1 555 6/15/2019
1.0.0 1,065 1/9/2019

First version