C# Prism框架详解:构建模块化WPF应用程序
1. Prism框架简介
Prism是一个用于构建松散耦合、可测试和可维护的WPF桌面应用程序的框架。它最初由微软模式与实践团队开发,现在由社区维护,是构建企业级WPF应用程序的首选框架之一。
Prism框架的核心优势:
- 模块化设计:将应用程序分解为独立的功能模块
- 松散耦合:通过依赖注入和事件聚合器实现组件间的松散耦合
- MVVM模式支持:提供完整的MVVM(Model-View-ViewModel)实现
- 导航框架:简化视图间的导航
- 区域管理:支持动态UI组合
- 命令模式:提供强大的命令绑定机制
2. Prism核心组件
2.1 模块化系统
Prism的模块化系统允许开发人员将应用程序分解为独立的功能模块,每个模块可以单独开发、测试和部署。
// 模块定义示例
public class CustomerModule : IModule
{private readonly IRegionManager _regionManager;public CustomerModule(IRegionManager regionManager){_regionManager = regionManager;}public void OnInitialized(IContainerProvider containerProvider){// 在区域中注册视图_regionManager.RegisterViewWithRegion("MainRegion", typeof(CustomerView));}public void RegisterTypes(IContainerRegistry containerRegistry){// 注册服务和视图containerRegistry.RegisterSingleton<ICustomerService, CustomerService>();containerRegistry.RegisterForNavigation<CustomerDetailView>();}
}
2.2 依赖注入容器
Prism支持多种依赖注入容器,包括Unity、DryIoc和Autofac。依赖注入是实现松散耦合的关键机制。
// 应用程序启动配置
protected override void ConfigureContainer()
{// 注册类型到DI容器Container.RegisterType<IOrderService, OrderService>(new ContainerControlledLifetimeManager());Container.RegisterType<ICustomerRepository, CustomerRepository>();
}
2.3 区域管理器
区域管理器允许在预定义的UI区域中动态加载和卸载视图,是实现模块化UI的核心组件。
// 在XAML中定义区域
<ContentControl prism:RegionManager.RegionName="MainRegion" />// 在代码中导航到区域
_regionManager.RequestNavigate("MainRegion", "CustomerView");
2.4 事件聚合器
事件聚合器提供了一种发布-订阅机制,允许模块之间进行通信而无需直接引用。
// 定义事件
public class CustomerUpdatedEvent : PubSubEvent<CustomerModel> { }// 发布事件
_eventAggregator.GetEvent<CustomerUpdatedEvent>().Publish(updatedCustomer);// 订阅事件
_eventAggregator.GetEvent<CustomerUpdatedEvent>().Subscribe(OnCustomerUpdated, ThreadOption.UIThread, false, customer => customer.Id == currentCustomerId);
3. MVVM模式实现
Prism提供了完整的MVVM实现,包括BindableBase基类、DelegateCommand和导航服务。
3.1 BindableBase
BindableBase类实现了INotifyPropertyChanged接口,简化了属性变更通知。
public class CustomerViewModel : BindableBase
{private string _name;public string Name{get => _name;set => SetProperty(ref _name, value);}private bool _isActive;public bool IsActive{get => _isActive;set => SetProperty(ref _isActive, value, () => RaisePropertyChanged(nameof(StatusDisplay)));}public string StatusDisplay => IsActive ? "活跃" : "非活跃";
}
3.2 DelegateCommand
DelegateCommand提供了命令模式的实现,支持命令执行条件和命令状态更新。
public class OrderViewModel : BindableBase
{private readonly IOrderService _orderService;private Order _currentOrder;public DelegateCommand SubmitOrderCommand { get; private set; }public OrderViewModel(IOrderService orderService){_orderService = orderService;SubmitOrderCommand = new DelegateCommand(ExecuteSubmitOrder, CanSubmitOrder).ObservesProperty(() => CurrentOrder.IsValid);}private bool CanSubmitOrder(){return CurrentOrder != null && CurrentOrder.IsValid;}private void ExecuteSubmitOrder(){_orderService.SubmitOrder(CurrentOrder);}public Order CurrentOrder{get => _currentOrder;set => SetProperty(ref _currentOrder, value);}
}
4. 导航框架
Prism的导航框架简化了视图之间的导航,支持导航参数和导航回调。
// 注册导航
containerRegistry.RegisterForNavigation<ProductDetailView>("ProductDetail");// 执行导航
_navigationService.NavigateAsync("ProductDetail?id=123", new NavigationParameters{{ "category", "electronics" }});// 在目标ViewModel中接收参数
public override void OnNavigatedTo(INavigationParameters parameters)
{if (parameters.ContainsKey("id")){string productId = parameters.GetValue<string>("id");LoadProduct(productId);}
}
5. 对话框服务
Prism提供了对话框服务,用于显示模态和非模态对话框。
// 注册对话框
containerRegistry.RegisterDialog<ConfirmationDialog, ConfirmationDialogViewModel>();// 显示对话框
_dialogService.ShowDialog("ConfirmationDialog", new DialogParameters{{ "title", "确认删除" },{ "message", "确定要删除此项目吗?" }}, r =>{if (r.Result == ButtonResult.OK){DeleteItem();}});
6. 实际应用示例
下面是一个简单的Prism应用程序结构示例:
MyPrismApp/
├── MyPrismApp.Core/ # 核心库,包含共享接口和模型
├── MyPrismApp.Modules.Orders/ # 订单模块
├── MyPrismApp.Modules.Customers/ # 客户模块
├── MyPrismApp.Modules.Products/ # 产品模块
└── MyPrismApp/ # 主应用程序├── App.xaml├── App.xaml.cs└── Shell.xaml # 主窗口
6.1 应用程序启动类
public partial class App : PrismApplication
{protected override Window CreateShell(){return Container.Resolve<Shell>();}protected override void RegisterTypes(IContainerRegistry containerRegistry){containerRegistry.RegisterSingleton<IApplicationSettingsService, ApplicationSettingsService>();containerRegistry.RegisterSingleton<IThemeService, ThemeService>();}protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog){// 注册模块moduleCatalog.AddModule<CustomersModule>();moduleCatalog.AddModule<OrdersModule>();moduleCatalog.AddModule<ProductsModule>();}
}
6.2 Shell视图
<Window x:Class="MyPrismApp.Views.Shell"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:prism="http://prismlibrary.com/"Title="Prism应用示例" Height="600" Width="800"><Grid><Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="*"/><RowDefinition Height="Auto"/></Grid.RowDefinitions><!-- 顶部菜单 --><Menu Grid.Row="0"><MenuItem Header="文件"><MenuItem Header="退出" Command="{Binding ExitCommand}"/></MenuItem><MenuItem Header="客户" Command="{Binding NavigateCommand}" CommandParameter="Customers"/><MenuItem Header="订单" Command="{Binding NavigateCommand}" CommandParameter="Orders"/><MenuItem Header="产品" Command="{Binding NavigateCommand}" CommandParameter="Products"/></Menu><!-- 主内容区域 --><ContentControl Grid.Row="1" prism:RegionManager.RegionName="MainRegion" /><!-- 状态栏 --><StatusBar Grid.Row="2"><TextBlock Text="{Binding StatusMessage}" /></StatusBar></Grid>
</Window>
7. 最佳实践
7.1 模块设计原则
- 每个模块应该是自包含的,拥有自己的视图、视图模型和服务
- 模块之间通过接口和事件聚合器通信,避免直接引用
- 共享功能应放在核心模块中
7.2 性能优化
- 使用按需加载模块,减少启动时间
- 合理使用CompositeCommand,避免过多的命令绑定
- 优化区域管理器的视图切换
// 配置按需加载模块
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{// 启动时加载moduleCatalog.AddModule<CoreModule>();// 按需加载moduleCatalog.AddModule(typeof(ReportsModule).Name, typeof(ReportsModule).AssemblyQualifiedName, InitializationMode.OnDemand);
}
7.3 测试策略
Prism的松散耦合设计使得单元测试变得简单:
[TestMethod]
public void CanExecuteSubmitOrder_WithValidOrder_ReturnsTrue()
{// Arrangevar orderServiceMock = new Mock<IOrderService>();var viewModel = new OrderViewModel(orderServiceMock.Object);var order = new Order { IsValid = true };viewModel.CurrentOrder = order;// Actbool canExecute = viewModel.SubmitOrderCommand.CanExecute();// AssertAssert.IsTrue(canExecute);
}
8. 与其他框架的比较
特性 | Prism | MVVM Light | Caliburn.Micro |
---|---|---|---|
模块化 | ✓ | ✗ | 部分支持 |
依赖注入 | ✓ | 部分支持 | ✓ |
区域管理 | ✓ | ✗ | ✗ |
事件聚合器 | ✓ | ✓ | ✓ |
导航框架 | ✓ | 部分支持 | ✓ |
对话框服务 | ✓ | ✗ | ✓ |
学习曲线 | 中等 | 低 | 高 |
社区支持 | 活跃 | 一般 | 一般 |
9. 总结
Prism框架是构建企业级WPF应用程序的强大工具,它提供了模块化、松散耦合和MVVM支持等关键特性。通过使用Prism,开发人员可以创建可维护、可测试和可扩展的应用程序。
虽然Prism有一定的学习曲线,但其提供的功能和架构优势使其成为大型WPF应用程序开发的理想选择。对于需要构建复杂、模块化桌面应用的团队来说,投资学习Prism将带来长期的收益。
10. 参考资源
- Prism官方文档
- Prism GitHub仓库
- Prism参考应用
- Brian Lagunas的Prism视频教程
相关文章:
C# Prism框架详解:构建模块化WPF应用程序
1. Prism框架简介 Prism是一个用于构建松散耦合、可测试和可维护的WPF桌面应用程序的框架。它最初由微软模式与实践团队开发,现在由社区维护,是构建企业级WPF应用程序的首选框架之一。 Prism框架的核心优势: 模块化设计:将应用…...
【工具教程】图片识别内容改名,图片指定区域识别重命名,批量识别单据扫描件批量改名,基于WPF和腾讯OCR的实现方案
基于WPF和腾讯OCR的图片指定区域识别与批量重命名实现方案 一、应用场景 电商商品管理 电商平台每天需处理大量商品图片,原始文件名无规律(如IMG_001.jpg)。通过指定图片中商品名称、颜色、尺码等区域,OCR识别后自动重命名…...
数独求解器3.0 增加latex格式读取
首先说明两种读入格式 latex输入格式说明 \documentclass{article} \begin{document}This is some text before oku.\begin{array}{|l|l|l|l|l|l|l|l|l|} \hline & & & & 5 & & 2 & 9 \\ \hline& & 5 & 1 & & 7…...
WPF核心类继承树结构
WPF(Windows Presentation Foundation)的类继承结构非常庞大而复杂,以下是最核心的继承树结构,按照主要功能区域展示: 基础对象层级 Object └── DispatcherObject└── DependencyObject├── Freezable│ ├── Animatable│ │ …...
Mysql的binlog日志
环境准备 [rootmysql152 ~]# yum install -y mysql-server mysql [rootmysql152 ~]# systemctl enable mysqld --now1.查看正在使用的binlog日志文件 mysql> show master status; ---------------------------------------------------------------------------- | File …...
Java 安全SPEL 表达式SSTI 模版注入XXEJDBCMyBatis 注入
https://github.com/bewhale/JavaSec https://github.com/j3ers3/Hello-Java-Sec https://mp.weixin.qq.com/s/ZO4tpz9ys6kCIryNhA5nYw #Java 安全 -SQL 注入 -JDBC&MyBatis -JDBC 1 、采用 Statement 方法拼接 SQL 语句 2 、 PrepareStatement 会对 SQL 语…...
TypeScript 泛型讲解
如果说 TypeScript 是一门对类型进行编程的语言,那么泛型就是这门语言里的(函数)参数。本章,我将会从多角度讲解 TypeScript 中无处不在的泛型,以及它在类型别名、对象类型、函数与 Class 中的使用方式。 一、泛型的核…...
BERT、GPT-3与超越:NLP模型演进全解析
自然语言处理(NLP)领域近年来经历了前所未有的变革,从早期的统计方法到如今的深度学习大模型,技术的进步推动了机器理解、生成和交互能力的飞跃。其中,BERT和GPT-3作为两个里程碑式的模型,分别代表了不同的…...
RISC-V IDE MRS2 开发笔记一:volatile关键字的使用
RISC-V IDE MRS2 开发笔记一:volatile关键字的使用 一、volatile是什么 二、GCC 中 volatile 的行为 2.1禁止编译器优化 2.2 不等于内存屏障 2.3 GCC扩展行为 三、什么时候需要 volatile 3.1防止编译器优化掉“有效代码” 3.2 访问硬件寄存器 3.3 中断服务…...
25、工业防火墙 - 工控网络保护 (模拟) - /安全与维护组件/industrial-firewall-dcs-protection
76个工业组件库示例汇总 工业防火墙 - 工控网络保护 (模拟) 概述 这是一个交互式的 Web 组件,旨在模拟工业防火墙在保护关键工控网络(特别是 DCS - 分布式控制系统)免受网络攻击(如勒索软件传播)方面的核心功能。组件通过可视化简化的网络拓扑、模拟网络流量、应用防火…...
LAN(局域网)和WAN(广域网)
你的问题非常清晰!我来用一个直观的比喻实际拓扑图帮你彻底理解LAN(局域网)和WAN(广域网)如何协同工作,以及路由器在其中的位置。你可以把整个网络想象成一座城市: 1. 比喻:城市交通…...
ArcGIS Pro 3.4 二次开发 - Arcade
环境:ArcGIS Pro SDK 3.4 .NET 8 文章目录 Arcade1 基本查询1.1 基本查询1.2 使用要素进行基本查询1.3 使用 FeatureSetByName 检索要素1.4 使用过滤器检索要素1.5 使用数学函数计算基本统计量1.6 使用 FeatureSet 函数的 Filter 和 Intersects 2 评估表达式2.1 评…...
PCB智能报价系统——————仙盟创梦IDE
软件署名 代码贡献: 紫金电子科技有限公司 文案正路:cybersnow 正文 对企业的竞争力有着深远影响。传统的 PCB 报价方式往往依赖人工核算,不仅耗时较长,还容易出现误差。随着科技的发展,PCB 自动报价系统应运而生&a…...
灾备认证助力构建数据资产安全防线
信息安全保障人员(CISAW)-灾难备份与恢复认证 1.权威认证体系:技术护城河 在数字化进程加速的背景下,数据资产已成为政府与企业的核心资源,容灾备份能力成为保障业务连续性的关键。特别是近年来,因灾备缺…...
[特殊字符] 遇见Flask
一、初识Flask:像风一样自由 想象一下,你手里有一盒乐高积木——没有说明书,但每一块都精致小巧,任你组合成城堡、飞船,甚至整个宇宙。Flask就是这样一个存在。它不像Django那样“手把手教你搭房子”,而是…...
Axure高级交互设计:中继器嵌套动态面板实现超强体验感台账
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:中继器嵌套动态面板 主要内容:中继器内部嵌套动态面板,实现可移动式台账,增强数据表现…...
告别手动绘图!2分钟用 AI 生成波士顿矩阵
波士顿矩阵作为经典工具,始终是企业定位产品组合、制定竞争策略的核心方法论。然而,传统手动绘制矩阵的方式,往往面临数据处理繁琐、图表调整耗时、团队协作低效等痛点。 随着AI技术的发展,这一现状正在被彻底改变。boardmix博思白…...
iframe加载或者切换时候,短暂的白屏频闪问题解决
问题描述 iframe加载或者是切换iframe链接的时候,会有短暂的白屏,这个时候是在加载,目前没有想到避免的问题,应该是浏览器层面的,所以解决方法之一就是,用页面的主题背景色来遮盖一下,当他加载…...
Python数据可视化高级实战之一——绘制GE矩阵图
目录 一、课程概述 二、GE矩阵? 三、GE 矩阵图的适用范围 五、GE 矩阵的评估方法 (一)市场吸引力的评估要素 二、企业竞争实力的评估要素 三、评估方法与实践应用 1. 定量与定性结合法 2. 数据来源 六、GE矩阵的图形化实现 七、总结:GE 矩阵与 BCG 矩阵的对比分析 (一)GE…...
量子计算与云计算的融合:技术前沿与应用前景
目录 引言 量子计算基础 量子计算的基本原理 量子计算的优势与挑战 量子计算的发展阶段 云计算基础 云计算的基本概念 云计算的应用领域 云计算面临的挑战 量子计算与云计算的结合 量子云计算的概念与架构 量子云计算的服务模式 量子云计算的优势 量子云计算的发展…...
QMK固件RGB矩阵照明功能详解 - 打造你的专属炫彩键盘
QMK固件RGB矩阵照明功能详解 - 打造你的专属炫彩键盘 🌈 大家好!今天我要详细讲解QMK固件中的RGB矩阵照明功能,让你轻松打造一个真正炫彩的机械键盘!本文从基础原理到实战配置,手把手教你如何配置各种绚丽的灯光效果,即使你是小白也能轻松上手!文中所有代码都配有详细的…...
Rust 学习笔记:关于泛型的练习题
Rust 学习笔记:关于泛型的练习题 Rust 学习笔记:关于泛型的练习题问题 1下面代码能否通过编译?若能,输出是?下面代码能否通过编译?若能,输出是? Rust 学习笔记:关于泛型的…...
Panasonic松下焊接机器人节气
Panasonic松下焊接机器人节气装置 一、工作原理 松下焊接机器人节气装置的工作原理主要是通过智能控制技术,实现对焊接过程中气体流量的精确调节。例如,在焊接的不同阶段,根据焊接电流的大小自动调整气体的供给量。当焊接电流较强时&#x…...
2023 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(国赛) 解题报告 | 珂学家
前言 题解 2023 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(国赛)。 vp了下,题目挺好的,难度也适中,但是彻底红温了。 第二题,题意不是那么清晰, M i n ( K 1 , K 2 ) Min(K_1, K_2) Min(K1,K2)容易求&#x…...
LeetCode 3355.零数组变换 I:差分数组
【LetMeFly】3355.零数组变换 I:差分数组 力扣题目链接:https://leetcode.cn/problems/zero-array-transformation-i/ 给定一个长度为 n 的整数数组 nums 和一个二维数组 queries,其中 queries[i] [li, ri]。 对于每个查询 queries[i]&am…...
java21
1.数据结构之二叉树,二叉查找树,平衡二叉树 原理:和节点比较大小然后选左边还是右边 注意:中序遍历最常见,因为遍历的结果是从小到大 注意是任意节点,上面的二叉查找树的节点10的左子树高度是0,…...
ES的倒排索引和正排索引的区别及适用场景?为什么倒排索引适合全文搜索?
正排索引解析 1.存储机制 Elasticsearch 的文档存储机制比简单的固定字节分配更复杂,其核心原理如下: 1. 数值类型存储机制 对于 long/float/double 等数值类型: 文档ID2 → 偏移量 2 * sizeof(type) 例如:long 类型…...
ElasticSearch各种查询语法示例
1. 每种查询语法的区别与优缺点 Query DSL 区别: JSON 格式的结构化查询,功能强大,支持复杂查询逻辑,适用于 Elasticsearch 的核心查询场景。优点: 灵活,功能全面,支持全文搜索、精确匹配、聚合等;可组合…...
Ubuntu20.04部署KVM
文章目录 一. 环境准备关闭防火墙(UFW)禁用 SELinux更换镜像源检查 CPU 虚拟化支持 二. 安装KVM安装 KVM 及相关组件启动 libvirtd 服务验证安装创建虚拟机 一. 环境准备 4C8G,50G硬盘——VMware Workstation需要给虚拟机开启虚拟化引擎 roo…...
Android车载应用开发:Kotlin与Automotive OS深度实践
一、Android Automotive OS简介 Android Automotive OS(AAOS)是Google为车辆定制的操作系统,直接运行于车机硬件,提供完整的车载信息娱乐系统(IVI)。与Android Auto(手机投影方案)不…...
提示词工程(Prompt Engineering)是智能Agent交互中不可或缺的一环
Prompt Engineering 提示词,参考OpenAI提示词建议 2.5.1 概述 提示词工程(Prompt Engineering)是智能Agent交互中不可或缺的一环,它们指导智能体如何理解和回应用户的需求。这一节将探讨如何设计有效的提示词,以及如何通过精确的语言引导智能…...
九天画芯CEO张锦:AR 与 AI 融合重构智能终端生态,消费级市场迎来关键拐点
一、AR设备逆势突围:从技术验证到规模商用的跨越 根据洛图科技显示,2025 年 Q1 中国 XR(ARVR) 设备市场数据显示,AR 设备以 9.1 万台销量、116% 的同比增速远超 VR/MR 设备,这标志着消费级 AR 市场正式从 “…...
Python爬虫(32)Python爬虫高阶:动态页面处理与Scrapy+Selenium+BeautifulSoup分布式架构深度解析实战
目录 引言一、动态页面爬取的技术背景1.1 动态页面的核心特征1.2 传统爬虫的局限性 二、技术选型与架构设计2.1 核心组件分析2.2 架构设计思路1. 分层处理2. 数据流 三、代码实现与关键技术3.1 Selenium与Scrapy的中间件集成3.2 BeautifulSoup与Scrapy Item的整合3.3 分布式爬取…...
[案例七] NX二次开发标识特征的导入与布尔运算
本来做的是案例六NX二次开发减重块。但是当时在处理导入指定面时发现坐标转化存在很大问题,开了我很长时间,太难受了,决定放一放,昨天做了第六个案例采取了一种补救方法(实在不会的一种解决思路),个人认为NX这么优秀的软件应该有更好的方法,坐标转化真让人头大。刚开始…...
Canvas进阶篇:鼠标交互动画
Canvas进阶篇:鼠标交互动画 前言获取鼠标坐标鼠标事件点击事件监听代码示例效果预览 拖动事件监听代码示例效果预览 结语 前言 在上一篇文章Canvas进阶篇:基本动画详解 中,我们讲述了在Canvas中实现动画的基本步骤和动画的绘制方法。本文将进…...
Axure项目实战:智慧运输平台后台管理端-订单管理2(多级交互)
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:订单管理2 主要内容:中继器筛选、表单跟随菜单拖动、审批数据互通等 应用场景:订单管理…...
AG-UI:重构AI代理与前端交互的下一代协议标准
目录 技术演进背景与核心价值协议架构与技术原理深度解析核心功能与标准化事件体系典型应用场景与实战案例开发者生态与集成指南行业影响与未来展望1. 技术演进背景与核心价值 1.1 AI交互的三大痛点 当前AI应用生态面临三大核心挑战: 交互碎片化:LangGraph、CrewAI等框架各…...
鸿蒙版Flutter库torch_light手电筒功能深度适配
鸿蒙版Flutter库torch_light手电筒功能深度适配:跨平台开发者的光明之路 本项目作者:kirk/坚果 适配仓库地址 作者仓库:https://github.com/svprdga/torch_light# 在数字化浪潮的推动下,跨平台开发框架如 Flutter 凭借其高效、…...
【JAVA】中文我该怎么排序?
📘 Java 中文排序教学文档(基于 Collator) 🧠 目录 概述Java 中字符串排序的默认行为为什么需要 Collator使用 Collator 进行中文排序升序 vs 降序排序自定义对象字段排序多字段排序示例总结对比表附录:完整代码示例 …...
WPF MVVM Community Toolkit. Mvvm 社区框架
Community Toolkit. Mvvm 社区框架 微软官方文档 主要内容:CommunityToolkit.Mvvm 框架 概念,安装,使用(重要API:ObservableObject,RelayCommand)源生成器([ObservableProperty]&…...
云原生安全之PaaS:从基础到实践的技术指南
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 云原生安全之PaaS:从基础到实践的技术指南 一、基础概念 PaaS(Platform as a Service)平台 PaaS是一种云计算服务模型,为开发者提供应用程序的开发、部署和运行环境,涵…...
软件设计师考试需背诵知识点
1. 网络技术标准与协议 2. OSI/RM七层模型 3. 对称加密算法 4. 常见的非对称加密算法 5. 排序算法比较 6. 海明码公式 设数据位是n位,校验位是k位,则n与k必须满足以下关系: 7. McCabe度量法 McCabe度量法的核心公式为: V(G)E−…...
智慧社区新防线:华奥系AI技术如何让夏季安防“零隐患”
夏季社区安防隐患频发 随着夏季高温、暴雨、台风等极端天气增多,社区安全风险显著上升。高空建筑外墙材料因暴晒脱落、地下管道锈蚀堵塞导致积水、电动车充电自燃等事件频发,传统“人防物防”模式响应滞后、管理粗放,难以满足精细化防控需求…...
pinia的简单使用
yarn add pinia // 用来存储token,用户信息,等需要多地方使用的信息 src目录下新建store文件夹->新建index.ts import { createPinia } from "pinia";const store createPinia()export default storemain.ts 引用store import { createApp } from v…...
【Linux笔记】——线程池项目与线程安全单例模式
🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:Linux 🌹往期回顾🌹: 【Linux笔记】——简单实习一个日志项目 🔖流水不争,争的是滔滔不息 一、线程池设计二…...
用户有一个Django模型没有设置主键,现在需要设置主键。
用户有一个Django模型没有设置主键,现在需要设置主键。 from django.db import modelsclass CategoryAssistentModel(models.Model):second_level_category models.CharField(max_length100, nullTrue, blankTrue)third_level_category models.CharField(max_len…...
SkyWalking 报错:sw_profile_task 索引缺失问题分析与解决
文章目录 SkyWalking 报错:sw_profile_task 索引缺失问题分析与解决问题背景SkyWalking 是否会自动创建 sw_profile_task 索引?答案:不会在初始化时创建相关索引包括: 问题原因分析解决方案✅ 解决思路:手动创建 sw_pr…...
多模态学习笔记
在模态对齐任务中,同一时刻不同类型的数据(模态)需要做好对齐,才能更好的感知内容,下面对其常见的多模态对齐任务进行如下总结: (1)文本图像 图像和文本特征提取后的对齐方法主要分为两类:基于对比学习的方法和基于跨模态注意力的方法。以下是它们的细化说明及具体实…...
【 Redis | 实战篇 扩展 】
目录 前言: 1.达人探店功能 1.1.点赞功能 1.2.排行榜 2.关注 2.1.共同关注 2.2.关注推送 3.附近商铺 3.1.GEO基本用法 3.2.获取附近商铺 4.签到 4.1.BitMap 4.2.实现签到 4.3.统计连续签到 5.UV统计 前言: 实现达人探店,好友…...
【HarmonyOS Next之旅】DevEco Studio使用指南(二十五) -> 端云一体化开发 -> 业务介绍(二)
目录 1 -> 工作原理 2 -> 约束与限制 2.1 -> 支持的设备 2.2 -> 支持的国家/地区 2.3 -> 支持的签名方式 3 -> 总结 3.1 -> 关键功能与工具 3.2 -> 开发流程 3.3 -> 典型场景与优化 3.4 -> 常见问题与解决 3.5 -> 总结 1 -> 工…...