Pular para o conteúdo
Skillpedia
APIs e servidores (backend)40 mil · #5246

mvvm-toolkit-messenger

Faz seu agente permitir que partes de um aplicativo conversem entre si. Ele usa um sistema de mensagens para comunicação desacoplada.

O que ela faz

Este código permite que diferentes partes do seu programa se comuniquem sem se conhecerem diretamente. É como um sistema de rádio onde uma parte envia uma mensagem e outras partes interessadas a recebem.

Quando usar

  • ✓Quando duas partes do programa precisam avisar uma à outra sobre algo (ex: login, mudança de tema).
  • ✓Quando uma parte precisa pedir uma informação para outra e esperar uma resposta.
  • ✓Para organizar a comunicação em grupos específicos, como em uma janela específica.

Exemplo do que pedir para a IA

“Me avise quando o tema escuro for ativado.”

Quer saber mais? Abra as seções abaixo.

Como usar

O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.

Link da skill

https://github.com/github/awesome-copilot/blob/main/skills/mvvm-toolkit-messenger/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/github/awesome-copilot/blob/main/skills/mvvm-toolkit-messenger/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

Ele usa um padrão chamado 'publicador/assinante'. Uma parte 'publica' uma mensagem e outras partes 'assinam' para receber essas mensagens. As mensagens podem ser enviadas com referências fracas para que não impeçam o programa de limpar a memória.

Instalação

Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.

No terminal (Claude Code, Codex, Cursor), na pasta do projeto:

npx skills add github/awesome-copilot --skill mvvm-toolkit-messenger

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/github/awesome-copilot/main/skills/mvvm-toolkit-messenger/SKILL.md -o SKILL.md
Conteúdo técnico (SKILL.md)

Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.

CommunityToolkit.Mvvm Messenger

Mensagens de publicação/assinatura para ViewModels (ou quaisquer objetos) sem forçar um gráfico de referência compartilhado. Parte do CommunityToolkit.Mvvm 8.x.

RESUMO. Use WeakReferenceMessenger.Default por padrão. Registre manipuladores com a lambda (recipient, message) e o modificador static para que você nunca capture this. Herde de ObservableRecipient e alterne IsActive na ativação/desativação para obter registro/cancelamento automático.


Quando usar esta funcionalidade

  • Dois ou mais ViewModels precisam reagir a um evento (login, mudança de tema, salvar, navegação) sem manter referências uns aos outros
  • Um ViewModel precisa pedir um valor a outro VM (solicitar/responder)
  • Você está escopando eventos para um subsistema ou janela com tokens de canal
  • Diagnosticando problemas de "meu manipulador nunca é acionado" ou problemas de tempo de vida do destinatário de referência fraca

Para geradores de código-fonte, classes base e comandos, consulte a funcionalidade mvvm-toolkit. Para configuração de DI (registrar uma instância IMessenger), consulte mvvm-toolkit-di.


Escolha uma implementação

Tipo Quando
WeakReferenceMessenger.Default Padrão. Destinatários mantidos fracamente — elegíveis para GC mesmo enquanto registrados. O corte interno é executado durante GCs completos; nenhum Cleanup() manual é necessário.
StrongReferenceMessenger.Default O profiler mostra que o messenger está ativo e a alocação importa. Os destinatários são fixados até que você Unregister. Esquecer o cancelamento de registro os vaza.
Instância Custom IMessenger Por janela/por escopo (por exemplo, um messenger por janela do aplicativo). Construa diretamente, injete via DI.

O construtor sem parâmetros de ObservableRecipient usa WeakReferenceMessenger.Default. Passe um IMessenger diferente para o seu construtor para substituir.


Definir uma mensagem

O toolkit fornece classes base; qualquer classe funciona.

using CommunityToolkit.Mvvm.Messaging.Messages;

// Single-payload broadcast
public sealed class LoggedInUserChangedMessage(User user)
    : ValueChangedMessage<User>(user);

// Custom shape (records are great for this)
public sealed record ThemeChangedMessage(AppTheme NewTheme);

// Empty signal
public sealed record RefreshRequestedMessage;

Registrar um destinatário

Estilo Lambda (recomendado)

WeakReferenceMessenger.Default.Register<MyViewModel, ThemeChangedMessage>(
    this,
    static (recipient, message) => recipient.OnThemeChanged(message.NewTheme));

O modificador static impede a alocação acidental de fechamento e mantém this fora da lambda — use o parâmetro recipient em vez disso.

Estilo de interface IRecipient<TMessage>

public sealed class MyViewModel : ObservableRecipient,
    IRecipient<ThemeChangedMessage>,
    IRecipient<RefreshRequestedMessage>
{
    public void Receive(ThemeChangedMessage message) { /* ... */ }
    public void Receive(RefreshRequestedMessage message) { /* ... */ }
}

ObservableRecipient.OnActivated() chama Messenger.RegisterAll(this), que assina cada interface IRecipient<T> implementada pelo tipo. Se você não estiver usando ObservableRecipient, registre manualmente:

WeakReferenceMessenger.Default.RegisterAll(this);

Enviar uma mensagem

WeakReferenceMessenger.Default.Send(new ThemeChangedMessage(AppTheme.Dark));

// Empty payloads use the parameterless overload:
WeakReferenceMessenger.Default.Send<RefreshRequestedMessage>();

Canais (tokens)

Escope mensagens para um subsistema ou janela com um token (qualquer valor equatable — int, string, Guid):

const int LeftPaneChannel = 1;

WeakReferenceMessenger.Default.Register<MyViewModel, RefreshRequestedMessage, int>(
    this, LeftPaneChannel,
    static (r, _) => r.RefreshLeft());

WeakReferenceMessenger.Default.Send(new RefreshRequestedMessage(), LeftPaneChannel);

Mensagens enviadas sem um token usam o canal compartilhado padrão — elas não são entregues a destinatários com escopo de canal.


Solicitar / Responder

Para cenários de "perguntar" onde um destinatário fornece um valor de volta ao remetente, use a família RequestMessage<T>.

Solicitação síncrona

public sealed class CurrentUserRequest : RequestMessage<User> { }

WeakReferenceMessenger.Default.Register<UserService, CurrentUserRequest>(
    this,
    static (r, m) => m.Reply(r.CurrentUser));

User user = WeakReferenceMessenger.Default.Send<CurrentUserRequest>();

A conversão implícita de CurrentUserRequest para User lança uma exceção se nenhum

…

Perguntas frequentes

Qual a diferença entre 'WeakReferenceMessenger' e 'StrongReferenceMessenger'?

'WeakReferenceMessenger' é o padrão e permite que o programa libere a memória de quem recebeu a mensagem se não for mais necessário. 'StrongReferenceMessenger' mantém a referência ativa até que seja explicitamente removida, o que pode causar vazamentos de memória se não for gerenciado corretamente.

O que é 'ObservableRecipient'?

É uma classe que facilita o registro e cancelamento automático de mensagens quando o componente está ativo ou inativo, simplificando o gerenciamento do ciclo de vida das mensagens.

Como eu envio uma mensagem?

Você usa o método 'Send' do Messenger, passando a mensagem que deseja enviar. Por exemplo: `WeakReferenceMessenger.Default.Send(new MinhaMensagem());`

Detalhes

Descrição original do autor

CommunityToolkit.Mvvm Messenger pub/sub for decoupled communication between ViewModels (or any objects). Covers WeakReferenceMessenger vs StrongReferenceMessenger, IRecipient<TMessage>, RequestMessage<T> / AsyncRequestMessage<T> / CollectionRequestMessage<T>, ValueChangedMessage<T>, channels (tokens), and the ObservableRecipient activation lifecycle. Use across WPF, WinUI 3, .NET MAUI, Uno, and Av

repo: github/awesome-copilot

Popularidade

Estrelas no GitHub
40 mil
Posição no ranking
#5246
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas