讲师中心 微信公众号
AI工具推荐 视频效率加速

C# Avalonia如何使用依赖注入 Avalonia DI框架集成教程

星宇同学_6481

星宇同学_6481

发布时间:2026-02-06 08:23:48

|

851人浏览过

|

来源于php中文网

原创

Avalonia 使用 .NET 原生 Microsoft.Extensions.DependencyInjection 实现依赖注入,通过 AppBuilder.ConfigureServices 注册服务,并在 ViewModel 或必要组件中通过构造函数注入;不推荐在 View 中直接注入业务服务,应交由 ViewModel 处理。

c# avalonia如何使用依赖注入 avalonia di框架集成教程

在 Avalonia 中使用依赖注入(DI)和 .NET 原生的 Microsoft.Extensions.DependencyInjection 是标准做法,Avalonia 本身不提供独立的“DI 框架”,而是无缝集成 .NET 的通用主机(Generic Host)和 DI 容器。关键在于正确配置 AppBuilder,将服务注册到容器,并在视图、视图模型或控件中通过构造函数注入。

注册服务到 Avalonia DI 容器

Avalonia 应用启动时通过 AppBuilder 配置服务。你应在 Program.cs 中调用 UseStartup<app>()</app> 或直接使用 SetupWithoutStarting() + 手动构建主机,推荐前者以保持与 .NET 主机模式一致。

示例(.NET 6+,使用 AppBuilder):

// Program.cs
using Avalonia;
using Avalonia.Controls.ApplicationLifetimes;
using Microsoft.Extensions.DependencyInjection;

class Program
{
    [STAThread]
    public static void Main(string[] args)
    {
        BuildAvaloniaApp()
            .StartWithClassicDesktopLifetime(args);
    }

    public static AppBuilder BuildAvaloniaApp() => AppBuilder.Configure<App>()
        .UsePlatformDetect()
        .LogToTrace()
        .UseReactiveUI()
        .SetupWithoutStarting() // 先不启动,以便配置 DI
        .ConfigureServices((ctx, services) =>
        {
            // 注册你的服务(瞬态、作用域、单例)
            services.AddSingleton<IDataService, MockDataService>();
            services.AddScoped<MainViewModel>();
            services.AddTransient<INotificationService, ToastNotificationService>();

            // 可选:注册 Avalonia 相关服务(如窗口管理器)
            services.AddSingleton<IWindowManager, WindowManager>();
        });
}

在 ViewModel 中使用构造函数注入

Avalonia 的 ViewModel 默认由 DI 容器解析(前提是你在 XAML 中启用了自动绑定或手动指定 DataContext)。只要 ViewModel 类型已注册,且其构造函数参数都能被容器解析,就能自动注入。

  • 确保 ViewModel 在 ConfigureServices 中注册(如 Scoped 或 Transient)
  • XAML 中不要硬编码 DataContext,改用 ViewModel={Binding} 或依赖 Locator
  • 推荐使用 Locator 模式(ReactiveUI 或自定义)统一管理 ViewModel 生命周期

例如:

react-pro
react-pro

你是一位 React 专家,擅长高级 Hook、性能优化、状态管理和现代 React 模式。适用场景:高级 Hook 模式...

下载
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        // 若未设置 DataContext,Avalonia 会尝试从 DI 容器解析 MainViewModel
        // (需启用 ReactiveUI 或自定义 Locator)
    }
}

在 View 或 UserControl 中注入服务

View(如 Window 或 UserControl)本身**不建议直接注入业务服务**,但可在构造函数中注入生命周期短的服务(如 IWindowManager、IDialogService),前提是这些服务已在容器中注册且是 Transient 或 Scoped。

  • View 构造函数支持注入,但仅限于 Avalonia 启动后容器已就绪的场景(即 SetupWithoutStarting + Start 流程)
  • 避免在 View 中注入耗时或跨生命周期的服务(如数据库上下文),应交由 ViewModel 处理
  • 若需在 View 中获取服务,也可通过 Application.Current?.Services.GetService<t>()</t>(不推荐,破坏测试性)

配合 ReactiveUI 使用更自然的 DI

如果你使用 ReactiveUI(Avalonia 官方推荐组合),可借助 WhenActivated 和 Locator 实现更清晰的依赖管理:

  • 用 Locator.CurrentMutable.RegisterConstant(...) 注册服务(适合全局单例)
  • ViewModel 继承 ReactiveObject 并在构造函数接收依赖,ReactiveUI 自动参与 DI 解析
  • 在 App.OnFrameworkInitializationCompleted 中初始化 Locator,与 IServiceProvider 对齐

简单对齐方式:

// App.xaml.cs
public override void OnFrameworkInitializationCompleted()
{
    if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
    {
        // 将 IServiceProvider 注入 ReactiveUI Locator
        Locator.CurrentMutable.InitializeSplat();
        Locator.CurrentMutable.InitializeReactiveUI();
        Locator.CurrentMutable.Register(() => Application.Current!.Services.GetRequiredService<IDataService>(), typeof(IDataService));
    }
    base.OnFrameworkInitializationCompleted();
}

基本上就这些。Avalonia 的 DI 不复杂但容易忽略 Setup 顺序和生命周期匹配——重点是用好 ConfigureServices,把服务注册清楚,再让 ViewModel 或必要组件通过构造函数自然消费。不需要引入第三方 DI 框架,.NET 原生容器完全够用。

热门AI工具

更多
AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

2785

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

3981

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

3071

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

987

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

2707

2023.10.09

数据库对象名无效怎么解决
数据库对象名无效怎么解决

数据库对象名无效解决办法:1、检查使用的对象名是否正确,确保没有拼写错误;2、检查数据库中是否已存在具有相同名称的对象,如果是,请更改对象名为一个不同的名称,然后重新创建;3、确保在连接数据库时使用了正确的用户名、密码和数据库名称;4、尝试重启数据库服务,然后再次尝试创建或使用对象;5、尝试更新驱动程序,然后再次尝试创建或使用对象。

2707

2023.10.16

vb连接access数据库的方法
vb连接access数据库的方法

vb连接access数据库方法:1、使用ADO连接,首先导入System.Data.OleDb模块,然后定义一个连接字符串,接着创建一个OleDbConnection对象并使用Open() 方法打开连接;2、使用DAO连接,首先导入 Microsoft.Jet.OLEDB模块,然后定义一个连接字符串,接着创建一个JetConnection对象并使用Open()方法打开连接即可。

2893

2023.10.16

vb连接数据库的方法
vb连接数据库的方法

vb连接数据库的方法有使用ADO对象库、使用OLEDB数据提供程序、使用ODBC数据源等。详细介绍:1、使用ADO对象库方法,ADO是一种用于访问数据库的COM组件,可以通过ADO连接数据库并执行SQL语句。可以使用ADODB.Connection对象来建立与数据库的连接,然后使用ADODB.Recordset对象来执行查询和操作数据;2、使用OLEDB数据提供程序方法等等。

2521

2023.10.19

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 12.3万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn