You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinUI 3类库用户控件中依赖注入的实现方法咨询

在WinUI 3类库的用户控件中实现依赖注入

1. 配置应用级ServiceProvider

首先在WinUI 3界面项目的App.xaml.cs中,创建并暴露全局的ServiceProvider,确保所有项目都能访问到DI容器:

using Microsoft.Extensions.DependencyInjection;

namespace YourWinUIAppNamespace;

public partial class App : Application
{
    // 暴露全局ServiceProvider
    public static IServiceProvider Services { get; private set; }

    protected override void OnLaunched(LaunchActivatedEventArgs args)
    {
        // 初始化DI容器
        var serviceCollection = new ServiceCollection();
        
        // 注册DataAccessUtil(根据实际需求选择Singleton/Scoped/Transient)
        serviceCollection.AddSingleton<DataAccessUtil>();
        
        // 注册其他服务(视图模型等)
        // serviceCollection.AddTransient<YourViewModel>();

        Services = serviceCollection.BuildServiceProvider();

        // 后续窗口初始化逻辑...
        var window = new MainWindow();
        window.Activate();
    }
}

2. 给类库中的用户控件添加注入逻辑

在WinUI 3类库的用户控件中,通过两种方式获取DataAccessUtil:

方式一:构造函数注入(推荐,符合DI原则)

添加带参数的构造函数供DI容器使用,同时保留无参构造供XAML设计器和实例化调用,通过全局ServiceProvider自动解析依赖:

using Microsoft.Extensions.DependencyInjection;
using YourCSharpLibraryNamespace; // 引用包含DataAccessUtil的类库

namespace YourWinUIControlLibraryNamespace;

public sealed partial class DropdownControl : UserControl
{
    private readonly DataAccessUtil _dataAccess;

    // 供DI容器使用的构造函数,标记ActivatorUtilitiesConstructor以支持自动解析
    [ActivatorUtilitiesConstructor]
    public DropdownControl(DataAccessUtil dataAccess)
    {
        InitializeComponent();
        _dataAccess = dataAccess;
        LoadDropdownOptions();
    }

    // 供XAML设计器和直接实例化使用的无参构造
    public DropdownControl() : this(App.Services.GetRequiredService<DataAccessUtil>())
    {
    }

    // 加载下拉框选项的方法
    private async void LoadDropdownOptions()
    {
        var options = await _dataAccess.GetDropdownOptionsAsync();
        YourComboBox.ItemsSource = options;
    }
}

方式二:直接从全局ServiceProvider获取(适合简单场景)

如果不需要构造函数注入,也可以在控件初始化时直接从App.Services获取服务:

using YourCSharpLibraryNamespace;

namespace YourWinUIControlLibraryNamespace;

public sealed partial class DropdownControl : UserControl
{
    public DropdownControl()
    {
        InitializeComponent();
        LoadDropdownOptions();
    }

    private async void LoadDropdownOptions()
    {
        var dataAccess = App.Services.GetRequiredService<DataAccessUtil>();
        var options = await dataAccess.GetDropdownOptionsAsync();
        YourComboBox.ItemsSource = options;
    }
}

3. 确保项目引用正确

  • WinUI 3类库项目需要引用包含DataAccessUtil的C#类库项目。
  • WinUI 3类库项目需要安装Microsoft.Extensions.DependencyInjection NuGet包(如果尚未安装)。

注意事项

  • 如果使用CommunityToolkit.Mvvm的导航功能,确保页面是通过DI容器创建的,这样嵌套的用户控件也能自动解析依赖。
  • 避免在XAML设计器中出现服务未初始化的错误,可以在无参构造中添加设计时判断:
    public DropdownControl()
    {
        InitializeComponent();
        if (!DesignMode.DesignModeEnabled)
        {
            _dataAccess = App.Services.GetRequiredService<DataAccessUtil>();
            LoadDropdownOptions();
        }
    }
    

内容的提问来源于stack exchange,提问作者Terrence

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 15:42:41