Propagating Changes Across the App
Problem
In modern applications, it's essential to manage and propagate state changes across different parts of the application efficiently.
Solution
The IMessenger
interface provided by Uno.Extensions
allows components to communicate effectively without tight coupling, using messages to signify state changes. This pattern is particularly useful in managing reactive updates across different layers of the application, such as services and view models.
Setup
Ensure IMessenger
is registered in your application's services during startup in the ConfigureServices
method:
host.ConfigureServices((context, services) =>
{
services
... // other services
.AddSingleton<IMessenger, WeakReferenceMessenger>();
})
Using IMessenger in Services
Inject the IMessenger
into the CookbookService
:
public class CookbookService(ChefsApiClient client, IMessenger messenger, IUserService userService): ICookbookService
{
...
}
When a cookbook is created, updated, or deleted, send a message to notify subscribers:
public async ValueTask Update(Cookbook cookbook, CancellationToken ct)
{
var cookbookData = cookbook.ToData();
await client.Api.Cookbook.PutAsync(cookbookData, cancellationToken: ct);
messenger.Send(new EntityMessage<Cookbook>(EntityChange.Updated, cookbook));
}
Reacting to Changes in ViewModels
Subscribe to messages in the ViewModel to react to changes in the service:
public IState<Cookbook> Cookbook => State
.Value(this, () => _cookbook ?? new Cookbook())
.Observe(_messenger, cb => cb.Id);
This pattern will automatically update the provided IState
property when a message is received.