C#界面框架Avalonia中使用依赖注入

news2025/2/5 22:07:54

Avalonia

  • 定义
    Avalonia 是一个跨平台的.NET 用户界面框架。它允许开发者使用 C# 和 XAML(可扩展应用程序标记语言)来构建桌面、移动和 Web 应用程序。类似于 Windows Presentation Foundation (WPF) 和 Universal Windows Platform (UWP),但具有更广泛的平台兼容性。
  • 平台支持
    它支持 Windows、Linux、macOS 等桌面操作系统,并且通过一些额外的工作和适配,也能够用于移动设备(如 Android 和 iOS,不过在移动方面还在不断完善)和 WebAssembly,实现了真正的跨平台开发。
  • 性能方面
    Avalonia 在性能上有不错的表现。它采用了高效的渲染管道,能够快速地绘制界面元素。例如,在处理复杂的图形界面和大量数据的可视化展示时,它可以有效地利用硬件加速,减少卡顿现象。

Microsoft.Extensions.DependencyInjection

  • 概述
    Microsoft.Extensions.DependencyInjection是.NET 中的一个轻量级的依赖注入(Dependency Injection,简称 DI)容器框架。它提供了一种在应用程序中管理对象及其依赖关系的方式,是构建可维护、可测试和松散耦合应用程序的关键组件。
    依赖注入是一种设计模式,它允许将对象的创建和其依赖对象的提供从对象本身分离出来。这使得代码更加模块化,更容易进行单元测试和替换实现。

服务生命周期(Service Lifecycle)

  • Transient(临时)
    每次从服务容器中请求一个临时服务时,都会创建一个新的服务实例。这对于无状态的服务或者每次使用都需要独立状态的服务非常有用。例如,一个处理网络请求的服务,每次请求可能都需要一个新的实例来处理不同的数据。
    假设我们有一个DataProcessor服务,它被注册为临时服务。当在不同的地方多次请求这个服务时,每次都会得到一个全新的DataProcessor实例。
  • Scoped(作用域)
    在一个作用域内,同一个服务实例会被共享。作用域通常与请求或者业务操作的范围相关。例如,在一个 Web 请求的上下文中,同一个作用域内的服务实例是相同的。
    以一个 Web API 应用为例,在处理一个 HTTP 请求的过程中,所有在该请求作用域内请求的 Scoped 服务(比如数据库连接服务)会使用同一个实例,当新的请求到来时,会创建新的服务实例。
  • Singleton(单例)
    整个应用程序生命周期内,只有一个服务实例会被创建并共享。这适用于那些需要在整个应用中保持状态一致的服务,比如全局配置服务或者共享资源管理器。
    例如,一个AppSettings服务,用于读取和管理应用程序的配置信息。如果将其注册为单例服务,那么在整个应用运行期间,所有需要访问配置信息的地方都将使用同一个AppSettings实例。

示例

安装依赖注入容器

install-package Microsoft.Extensions.DependencyInjection

注册

在Avalonia的App.xaml的OnFrameworkInitializationCompleted事件中添加容器初始化和构建代码

  • 在 Avalonia 中,OnFrameworkInitializationCompleted是一个重要的生命周期事件。它标志着 Avalonia 框架的初始化过程已经完成,应用程序的主窗口和相关资源已经基本准备就绪。这个事件发生在应用程序启动过程的后期阶段,对于执行一些依赖于框架初始化完成后的操作非常关键。

以下示例将添加Redis和第三方Avalonia样式库SukiUI作为参考

public MainWindow(ISukiToastManager sukiToastManager, ISukiDialogManager sukiDialogManager)

构建部分

ServiceProvider _services;

public override void OnFrameworkInitializationCompleted()
{
    var collection = new ServiceCollection();
    collection.AddCommonServices();
    collection.AddDistributedCache();

    _services = collection.BuildServiceProvider();

    var vm = _services.GetRequiredService<MainWindowViewModel>();
    var toastService = _services.GetRequiredService<ISukiToastManager>();
    var dialogService = _services.GetRequiredService<ISukiDialogManager>();
    if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
    {
        desktop.MainWindow = _services.GetRequiredService<MainWindow>();
    }
    else if (ApplicationLifetime is ISingleViewApplicationLifetime singleViewPlatform)
    {
        singleViewPlatform.MainView = new MainWindow(toastService, dialogService)
        {
            DataContext = vm,
        };
    }
    base.OnFrameworkInitializationCompleted();
}

注册部分

public static void AddCommonServices(this IServiceCollection collection)
{
    collection.AddSingleton<MainWindowViewModel>();
    collection.AddSingleton<MainWindow>(s => new MainWindow(
        s.GetRequiredService<ISukiToastManager>(),
        s.GetRequiredService<ISukiDialogManager>()
    )
    {
        DataContext = s.GetRequiredService<MainWindowViewModel>(),
    });
    collection.AddSingleton<ISukiToastManager>(s => DialogExManager.GetToastManager());
    collection.AddSingleton<ISukiDialogManager>(s => DialogExManager.GetDialogManager());
}

public static void AddDistributedCache(this IServiceCollection collection)
{
    var connection = ConnectionMultiplexer.Connect("127.0.0.1:6379");

    var redis = connection.GetDatabase();

    collection.AddSingleton(redis);
    collection.AddSingleton(connection);
    collection.AddSingleton<IDistributedCahce, RedisCache>(s =>
    {
        return new RedisCache(s.GetRequiredService<IDatabase>());
    });
}

public static class DialogExManager
{
    static ISukiToastManager ToastManager = new SukiToastManager();

    public static ISukiToastManager GetToastManager() => ToastManager;

    static ISukiDialogManager DialogManager = new SukiDialogManager();

    public static ISukiDialogManager GetDialogManager() => DialogManager;
}

注意: Avalonia如果启用了ViewLocator,那么ViewModel和View将会自动绑定,如下

public class ViewLocator : IDataTemplate
{
    public Control? Build(object? param)
    {
        if (param is null)
            return null;

        var name = param.GetType().FullName!.Replace("ViewModel", "View", StringComparison.Ordinal);
        var type = Type.GetType(name);

        if (type != null)
        {
            return (Control)Activator.CreateInstance(type)!;
        }

        return new TextBlock { Text = "Not Found: " + name };
    }

    public bool Match(object? data)
    {
        return data is ViewModelBase;
    }
}

若未启用ViewLocator,则自行在打开或复制Window的时候,对DataContext进行赋值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2277796.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习笔记合集

&#x1f525;转载来源&#xff1a;机器学习笔记合集 大家好&#xff0c;这里是好评笔记&#xff0c;公主 号&#xff1a;Goodnote。本笔记的任务是解读机器学习实践/面试过程中可能会用到的知识点&#xff0c;内容通俗易懂&#xff0c;入门、实习和校招轻松搞定。 笔记介绍 本…

2025年01月15日Github流行趋势

1. 项目名称&#xff1a;tabby - 项目地址url&#xff1a;https://github.com/TabbyML/tabby - 项目语言&#xff1a;Rust - 历史star数&#xff1a;25764 - 今日star数&#xff1a;1032 - 项目维护者&#xff1a;wsxiaoys, apps/autofix-ci, icycodes, liangfung, boxbeam - 项…

晨辉面试抽签和评分管理系统之九:随机编排考生的分组(以教师资格考试面试为例)

晨辉面试抽签和评分管理系统&#xff08;下载地址:www.chenhuisoft.cn&#xff09;是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…

Mongodb相关内容

Mongodb相关内容 1、Windows平台安装2、Linux平台安装3、基本常用命令文档更新删除文档分页查询索引 pymongo操作 客户端下载&#xff1a;https://download.csdn.net/download/guoqingru0311/90273435 1、Windows平台安装 方式一&#xff1a; 方式2&#xff1a; 方式3&#…

Vue3使用vue-count-to数字滚动模块报错解决方案

小伙伴们是不是遇到了vue3项目使用vue-count-to出现报错的问题 报错如下&#xff1a; TypeError: Cannot read properties of undefined (reading _c) 这个错误信息具体是说没读取到_c的属性 具体不清楚是什么原因&#xff0c;排查还得去看源码&#xff0c;所以我们来解决&a…

C#,图论与图算法,输出无向图“欧拉路径”的弗勒里(Fleury Algorithm)算法和源程序

1 欧拉路径 欧拉路径是图中每一条边只访问一次的路径。欧拉回路是在同一顶点上开始和结束的欧拉路径。 这里展示一种输出欧拉路径或回路的算法。 以下是Fleury用于打印欧拉轨迹或循环的算法&#xff08;源&#xff09;。 1、确保图形有0个或2个奇数顶点。2、如果有0个奇数顶…

H3CNE-12-静态路由(一)

静态路由应用场景&#xff1a; 静态路由是指由管理员手动配置和维护的路由 路由表&#xff1a;路由器用来妆发数据包的一张“地图” 查看命令&#xff1a; dis ip routing-table 直连路由&#xff1a;接口配置好IP地址并UP后自动生成的路由 静态路由配置&#xff1a; ip…

【2024年华为OD机试】 (C卷,100分)- 数字涂色(Java JS PythonC/C++)

一、问题描述 题目描述 疫情过后&#xff0c;希望小学终于又重新开学了&#xff0c;三年二班开学第一天的任务是将后面的黑板报重新制作。 黑板上已经写上了N个正整数&#xff0c;同学们需要给这每个数分别上一种颜色。 为了让黑板报既美观又有学习意义&#xff0c;老师要求…

JavaScript动态渲染页面爬取之Splash

Splash是一个 JavaScript渲染服务,是一个含有 HTTP API的轻量级浏览器,它还对接了 Python 中的 Twisted 库和 OT库。利用它&#xff0c;同样可以爬取动态渲染的页面。 功能介绍 利用 Splash&#xff0c;可以实现如下功能&#xff1a; 异步处理多个网页的渲染过程:获取渲染后…

天机学堂2-高并发优化

day04-高并发优化 方案选择 实现了学习计划和学习进度的统计功能。特别是学习进度部分&#xff0c;为了更精确的记录用户上一次播放的进度&#xff0c;我们采用的方案是&#xff1a;前端每隔15秒就发起一次请求&#xff0c;将播放记录写入数据库。 在并发较高的情况下&#xf…

ROS2 准备工作(虚拟机安装,Ubuntu安装,ROS2系统安装)

准备工作 虚拟机安装 大家可以自行去安装VMware链接&#xff1a;https://pan.baidu.com/s/1KcN1I9FN--Sp1bUsjKqWVA?pwd6666 提取码&#xff1a;6666(提供者&#xff1a;零基础编程入门教程) 教程&#xff1a;【【2025最新版】VMware虚拟机安装教程&#xff0c;手把手教你免…

在一个地方待多久才会改变ip属地

‌在当今数字化时代&#xff0c;IP地址作为网络世界的“门牌号”&#xff0c;不仅承载着设备连接互联网的身份信息&#xff0c;还常常与地理位置相关联。随着人们频繁地迁徙、旅行或在不同地点工作&#xff0c;一个自然而然的问题浮现在许多人心头&#xff1a;究竟在一个地方待…

CCLINKIE转ModbusTCP网关,助机器人“掀起”工业智能的“惊涛骇浪”

以下是一个稳联技术CCLINKIE转ModbusTCP网关&#xff08;WL-CCL-MTCP&#xff09;连接三菱PLC与机器人的配置案例&#xff1a;设备与软件准备设备&#xff1a;稳联技术WL-CCL-MTCP网关、三菱FX5UPLC、支持ModbusTCP协议的机器人、网线等。 稳联技术ModbusTCP转CCLINKIE网关&…

QT在 MacOS X上,如何检测点击程序坞中的Dock图标

最近在开发MacOS的qt应用&#xff0c;在做到最小化系统托盘功能时&#xff0c;发现关闭窗口后再次点击程序坞中的Dock图标不能将主界面再显示出来。查询里很多资料&#xff0c;发现是QT自身的问题&#xff0c;没有做相关的点击Dock图标的处理。 于是我参考了国内和国外的这两篇…

langchain4j执行源码分析

要做大模型应用&#xff0c;不可避免会接触到langchain&#xff0c;但是langchain本身使用py实现&#xff0c;对于java用户上手体验不是很友好。继而出现了java版的langchain&#xff0c;即langchain-4j。这里我们用脑图分析一下其执行源码。

【案例81】NMC调用导致数据库的效率问题

问题现象 客户在使用NC系统时&#xff0c;发现系统特别卡顿。需要紧急排查。 问题分析 排查NMC发现&#xff0c;所有的线程都处于执行SQL层面&#xff0c;说明数据库当前出现了异常。查看数据库资源状态发现&#xff0c;Oracle相关进程CPU利用率达到了100%。 查看现在数据库…

PyTorch框架——基于深度学习YOLOv5神经网络水果蔬菜检测识别系统

基于深度学习YOLOv5神经网络水果蔬菜检测识别系统&#xff0c;其能识别的水果蔬菜有15种&#xff0c;# 水果的种类 names: [黑葡萄, 绿葡萄, 樱桃, 西瓜, 龙眼, 香蕉, 芒果, 菠萝, 柚子, 草莓, 苹果, 柑橘, 火龙果, 梨子, 花生, 黄瓜, 土豆, 大蒜, 茄子, 白萝卜, 辣椒, 胡萝卜,…

DFT可测性设置与Tetramax测试笔记

1 DFT 1.1 DFT类型 1、扫描链&#xff08;SCAN&#xff09;&#xff1a; 扫描路径法是一种针对时序电路芯片的DFT方案.其基本原理是时序电路可以模型化为一个组合电路网络和带触发器(Flip-Flop&#xff0c;简称FF)的时序电路网络的反馈。 Scan 包括两个步骤&#xff0c;scan…

分布式ID的实现方案

1. 什么是分布式ID ​ 对于低访问量的系统来说&#xff0c;无需对数据库进行分库分表&#xff0c;单库单表完全可以应对&#xff0c;但是随着系统访问量的上升&#xff0c;单表单库的访问压力逐渐增大&#xff0c;这时候就需要采用分库分表的方案&#xff0c;来缓解压力。 ​…

28.找出字符串中第一个匹配项的下标【力扣】KMP前缀表 ≈ find() 函数、暴力解法

class Solution { public: //得到前缀表void getNext(int *next,string needle){int j0;for(int i1;i<needle.size();i){while(j>0 && needle[j]!needle[i]) jnext[j-1];//**j>0**>j0是出口if(needle[i]needle[j]) j;next[i]j;//若写入if中&#xff0c;则该…