MR
Mayur Rathi
@github
⭐ 34.1k GitHub stars

Mvvm-Toolkit-Di

Mvvm-Toolkit-Di is an code AI skill with a core value of Wire CommunityToolkit. It helps developers solve real-world problems in the code domain, boosting efficiency, automating repetitive tasks, and optimizing workflows.

Wire CommunityToolkit.Mvvm ViewModels into Microsoft.Extensions.DependencyInjection. Covers the .NET Generic Host composition root, constructor injection, service lifetimes (Singleton / Transient / Sc

Last verified on: 2026-07-14

Quick Facts

Category code
Works With Claude, GitHub Copilot
Source github/awesome-copilot
Stars ⭐ 34.1k
Last Verified 2026-07-14
Risk Level Low
mkdir -p ./skills/mvvm-toolkit-di && curl -sfL https://raw.githubusercontent.com/github/awesome-copilot/main/skills/mvvm-toolkit-di/SKILL.md -o ./skills/mvvm-toolkit-di/SKILL.md

Run in terminal / PowerShell. Requires curl (Unix) or PowerShell 5+ (Windows).

Skill Content

# CommunityToolkit.Mvvm + `Microsoft.Extensions.DependencyInjection`


The MVVM Toolkit deliberately ships **no DI container** — it composes with

`Microsoft.Extensions.DependencyInjection`, the same container ASP.NET

Core, Worker services, and the .NET Generic Host use.


> **TL;DR.** Build the service provider once at startup (prefer

> `Host.CreateDefaultBuilder()`). Register services and ViewModels.

> Inject through constructors. Avoid `Ioc.Default.GetService<T>()`

> in user code.


---


When to use this skill


- Standing up the composition root for a new XAML app (WPF, WinUI 3,

MAUI, Uno, Avalonia)

- Choosing service/VM lifetimes

- Wiring `IMessenger` once and injecting it into `ObservableRecipient`

ViewModels

- Resolving a page's ViewModel without coupling to a service locator

- Diagnosing "Unable to resolve service for type X while attempting to

activate Y"


For source generators and ViewModel patterns see the **`mvvm-toolkit`**

skill. For Messenger pub/sub see **`mvvm-toolkit-messenger`**.


---


Recommended composition root (Generic Host)


csharp
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>();
}

Generic Host benefits:


- `appsettings.json` binding via `Microsoft.Extensions.Configuration`

- Logging via `Microsoft.Extensions.Logging`

- Hosted services (`IHostedService`) for background work

- Scope validation in development builds


> WPF and Windows Forms must integrate the host lifetime with the app

> lifetime — see

> [Use the .NET Generic Host in a WPF app](https://learn.microsoft.com/en-us/dotnet/desktop/wpf/app-development/how-to-use-host-builder).


Without Generic Host


When you only need a service container and want zero extra dependencies:


csharp
var services = new ServiceCollection();
services.AddSingleton<IFilesService, FilesService>();
services.AddTransient<ContactViewModel>();
ServiceProvider provider = services.BuildServiceProvider();

---


Constructor injection


Inject services and child ViewModels through the constructor:


csharp
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!);
    }
}

Why constructor injection beats a service locator:


- Dependencies are explicit and visible at the call site

- Unit tests inject fakes/mocks directly

- The DI container validates the dependency graph at startup

- Missing registrations throw immediately, not at first use


---


Lifetimes


| Lifetime | Method | Typical use in XAML apps |

|----------|--------|--------------------------|

| Singleton | `AddSingleton<T>` | Shell/main-window VM, settings, file/HTTP services, the shared `IMessenger`, app-wide caches |

| Transient | `AddTransient<T>` | Per-page or per-document ViewModels (a fresh instance every resolve) |

| Scoped | `AddScoped<T>` | Rarely needed in client apps; useful with explicit `IServi

🎯 Best For

  • Claude users
  • GitHub Copilot users
  • Software engineers
  • Development teams
  • Tech leads

💡 Use Cases

  • Code quality improvement
  • Best practice enforcement

📖 How to Use This Skill

  1. 1

    Install the Skill

    Copy the install command from the Terminal tab and run it. The SKILL.md file downloads to your local skills directory.

  2. 2

    Load into Your AI Assistant

    Open Claude or GitHub Copilot and reference the skill. Paste the SKILL.md content or use the system prompt tab.

  3. 3

    Apply Mvvm-Toolkit-Di to Your Work

    Open your project in the AI assistant and ask it to apply the skill. Start with a small module to verify the output quality.

  4. 4

    Review and Refine

    Review AI suggestions before committing. Run tests, check for regressions, and iterate on the skill output.

❓ Frequently Asked Questions

Is Mvvm-Toolkit-Di compatible with Cursor and VS Code?

Yes — this skill works with any AI coding assistant including Cursor, VS Code with Copilot, and JetBrains IDEs.

Do I need specific dependencies for Mvvm-Toolkit-Di?

Check the install command and Works With section. Most code skills only require the AI assistant and your codebase.

How do I install Mvvm-Toolkit-Di?

Copy the install command from the Terminal tab and run it. The skill downloads to ./skills/mvvm-toolkit-di/SKILL.md, ready to use.

Can I customize this skill for my team?

Absolutely. Edit the SKILL.md file to add team-specific instructions, examples, or workflows.

⚠️ Common Mistakes to Avoid

Skipping validation

Always test AI-generated code changes, even for simple refactors.

Missing dependency updates

Check if the skill requires updated dependencies or new packages.

🔗 Related Skills