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

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

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

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/github/awesome-copilot/blob/main/skills/mvvm-toolkit-di/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
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-di

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/github/awesome-copilot/main/skills/mvvm-toolkit-di/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 + 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. Evite Ioc.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 IMessenger uma vez e injetá-lo em ObservableRecipient ViewModels
  • 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.json via Microsoft.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

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas