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.DependencyInjectionNuGet包(如果尚未安装)。
注意事项
- 如果使用CommunityToolkit.Mvvm的导航功能,确保页面是通过DI容器创建的,这样嵌套的用户控件也能自动解析依赖。
- 避免在XAML设计器中出现服务未初始化的错误,可以在无参构造中添加设计时判断:
public DropdownControl() { InitializeComponent(); if (!DesignMode.DesignModeEnabled) { _dataAccess = App.Services.GetRequiredService<DataAccessUtil>(); LoadDropdownOptions(); } }
内容的提问来源于stack exchange,提问作者Terrence
相关产品推荐
相关产品推荐

