MR
Mayur Rathi
@github
⭐ 34.1k GitHub stars

Mvvm-Toolkit-Di

Mvvm-Toolkit-Di是一款code方向的AI技能,核心价值是Wire CommunityToolkit,可用于解决开发者在code领域的实际问题,帮助用户提升效率、自动化重复任务或优化工作流。

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-05-30
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