mvvm-toolkit-di
Ajuda seu agente a conectar partes de aplicativos .NET. Ele gerencia como os componentes se comunicam e são criados.
O que ela faz
Esta 'skill' ajuda a conectar partes do seu código (chamadas ViewModels) com outras partes que fornecem serviços (como salvar arquivos ou enviar mensagens) de forma organizada. Ela usa um sistema chamado 'Dependency Injection' para que as partes certas se encontrem automaticamente.
Quando usar
- ✓Quando você está começando um novo aplicativo com interface gráfica (WPF, MAUI, etc.) e precisa organizar como as diferentes partes do seu programa se comunicam.
- ✓Para decidir quanto tempo um serviço ou ViewModel deve existir (para sempre, apenas quando necessário, etc.).
- ✓Para garantir que a comunicação por mensagens entre partes do seu aplicativo seja configurada corretamente e disponível onde for preciso.
Exemplo do que pedir para a IA
“Como eu configuro meu aplicativo para que ele saiba como criar e fornecer meus ViewModels e serviços?”
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
Mensagem pronta para colar
Como funciona
Ela usa um sistema chamado 'Dependency Injection' que funciona como um organizador. Você diz a ele quais serviços existem e como criá-los, e ele cuida de entregá-los automaticamente para onde forem necessários, geralmente através dos construtores das classes.
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-diOu baixe só o arquivo:
curl -L https://raw.githubusercontent.com/github/awesome-copilot/main/skills/mvvm-toolkit-di/SKILL.md -o SKILL.mdConteú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 + Microsoft.Extensions.DependencyInjection
O MVVM Toolkit deliberadamente não inclui um contêiner de DI — ele se compõe com
Microsoft.Extensions.DependencyInjection, o mesmo contêiner que ASP.NET
Core, Worker services e o .NET Generic Host utilizam.
Resumo. Crie o provedor de serviços uma vez na inicialização (prefira
Host.CreateDefaultBuilder()). Registre serviços e ViewModels. Injete através de construtores. EviteIoc.Default.GetService<T>()no código do usuário.
Quando usar esta habilidade
- Configurar a raiz de composição para um novo aplicativo XAML (WPF, WinUI 3, MAUI, Uno, Avalonia)
- Escolher tempos de vida de serviço/VM
- Configurar
IMessengeruma vez e injetá-lo emObservableRecipientViewModels - Resolver o ViewModel de uma página sem acoplamento a um localizador de serviços
- Diagnosticar "Unable to resolve service for type X while attempting to activate Y"
Para geradores de código-fonte e padrões de ViewModel, consulte a habilidade mvvm-toolkit. Para pub/sub do Messenger, consulte mvvm-toolkit-messenger.
Raiz de composição recomendada (Generic Host)
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using CommunityToolkit.Mvvm.Messaging;
public partial class App : Application
{
public IHost Host { get; }
public App()
{
Host = Microsoft.Extensions.Hosting.Host
.CreateDefaultBuilder()
.ConfigureServices((_, services) =>
{
services.AddSingleton<IFilesService, FilesService>();
services.AddSingleton<ISettingsService, SettingsService>();
services.AddSingleton<IMessenger>(WeakReferenceMessenger.Default);
services.AddSingleton<ShellViewModel>();
services.AddTransient<ContactViewModel>();
services.AddTransient<EditorViewModel>();
})
.Build();
}
public static T GetService<T>() where T : class =>
((App)Current).Host.Services.GetRequiredService<T>();
}
Benefícios do Generic Host:
- Vinculação
appsettings.jsonviaMicrosoft.Extensions.Configuration - Logging via
Microsoft.Extensions.Logging - Serviços hospedados (
IHostedService) para trabalho em segundo plano - Validação de escopo em builds de desenvolvimento
WPF e Windows Forms devem integrar o tempo de vida do host com o tempo de vida do aplicativo — consulte Use o .NET Generic Host em um aplicativo WPF.
Sem Generic Host
Quando você precisa apenas de um contêiner de serviços e deseja zero dependências extras:
var services = new ServiceCollection();
services.AddSingleton<IFilesService, FilesService>();
services.AddTransient<ContactViewModel>();
ServiceProvider provider = services.BuildServiceProvider();
Injeção de construtor
Injete serviços e ViewModels filhos através do construtor:
public sealed partial class ContactViewModel(
IFilesService files,
IMessenger messenger,
ILogger<ContactViewModel> logger)
: ObservableRecipient(messenger)
{
[ObservableProperty]
private string? name;
[RelayCommand]
private async Task SaveAsync()
{
logger.LogInformation("Saving {Name}", Name);
await files.SaveAsync(Name!);
}
}
Por que a injeção de construtor supera um localizador de serviços:
- As dependências são explícitas e visíveis no local da chamada
- Testes de unidade injetam fakes/mocks diretamente
- O contêiner de DI valida o grafo de dependência na inicialização
- Registros ausentes lançam erros imediatamente, não no primeiro uso
Tempos de vida
| Tempo de vida | Método | Uso típico em aplicativos XAML |
|---|---|---|
| Singleton | AddSingleton<T> |
VM da janela principal/shell, configurações, serviços de arquivo/HTTP, o IMessenger compartilhado, caches em todo o aplicativo |
| Transient | AddTransient<T> |
ViewModels por página ou por documento (uma nova instância a cada resolução) |
| Scoped | AddScoped<T> |
Raramente necessário em aplicativos cliente; útil com IServiceScope explícito (por exemplo, escopos por janela) |
services.AddSingleton<ShellViewModel>(); // 1 instance for app lifetime
services.AddTransient<NoteViewModel>(); // new instance per resolve
services.AddScoped<DialogService>(); // 1 per scope (rare)
Resolvendo em uma View
Resolva o ViewModel raiz da página no código-behind e, em seguida, deixe-o buscar suas próprias dependências:
public sealed partial class ContactPage : Page
{
public ContactViewModel ViewModel { get; }
…
Perguntas frequentes
O que é 'Dependency Injection'?
É uma forma de organizar seu código onde, em vez de uma classe criar suas próprias dependências (outras classes que ela precisa), essas dependências são 'injetadas' (fornecidas) de fora. Isso torna o código mais flexível e fácil de testar.
Qual a diferença entre Singleton, Transient e Scoped?
Singleton: existe apenas uma instância para toda a vida do aplicativo. Transient: uma nova instância é criada toda vez que é solicitada. Scoped: uma instância é criada por um 'escopo' específico, como uma janela ou uma requisição (menos comum em apps de desktop).
Por que não devo criar meus ViewModels manualmente?
Criar manualmente pode levar a código mais difícil de gerenciar e testar. Usar 'Dependency Injection' garante que as dependências sejam resolvidas corretamente e que você não precise se preocupar em como criá-las toda vez.
Detalhes
Descrição original do autor
Wire CommunityToolkit.Mvvm ViewModels into Microsoft.Extensions.DependencyInjection. Covers the .NET Generic Host composition root, constructor injection, service lifetimes (Singleton / Transient / Scoped), IMessenger registration, resolving ViewModels in Views, keyed services, testing seams, and the legacy Ioc.Default escape hatch. Use across WPF, WinUI 3, .NET MAUI, Uno, and Avalonia.
repo: github/awesome-copilot
Popularidade
- Estrelas no GitHub
- 40 mil
- Posição no ranking
- #5245
- Licença
- MIT
- Atualizada em
- 15/10/2026
Comentários
- …
Mais skills deste repositório
acquire-codebase-knowledge
Ajuda seu agente a entender e documentar um projeto de código existente. É útil para novas pessoas entrarem no projeto ou para ter uma visão geral da arquitetura.
github/awesome-copilot
acreadiness-assess
Faz seu agente avaliar a prontidão de um projeto para IA e gerar um relatório. É útil para entender o quão bem um projeto está preparado para usar ferramentas de IA.
github/awesome-copilot
acreadiness-generate-instructions
Ajuda seu agente a criar instruções para ferramentas de IA baseadas em uma avaliação. É útil para melhorar a forma como a IA interage com o código e fecha lacunas identificadas.
github/awesome-copilot
acreadiness-policy
Faz seu agente ajudar a definir ou aplicar políticas para avaliação de projetos de IA. É útil para padronizar a forma como os projetos são avaliados e garantir conformidade.
github/awesome-copilot
Skills parecidas
api-connector-builder
Faz seu agente construir novas conexões com APIs seguindo o padrão já existente. Use quando precisar adicionar mais uma integração sem criar um novo jeito de fazer.
affaan-m/ECC
api-design
Ajuda seu agente a projetar APIs REST seguindo as melhores práticas. É útil para definir como as APIs se comunicam, como os erros são mostrados e como organizar os dados.
affaan-m/ECC
backend-patterns
Ajuda seu agente com padrões de arquitetura do lado do servidor e otimização de banco de dados. É útil para construir ou revisar o código que roda no servidor.
affaan-m/ECC