【开源系列】Prism库:详解其核心组件和使用方法,助力构建高品质应用程序

news/2024/12/5 7:03:40/文章来源:https://www.cnblogs.com/o-O-oO/p/18587646

Prism库简介

Prism库是一个开源项目,由 Microsoft 社区开发和维护。它是一组用于创建 WPF、UWP 和 Xamarin 应用程序的工具和库,提供了一种基于模块化和依赖注入的架构模式,同时它提供了一系列的工具,帮助开发人员构建可扩展、可维护、可测试的大型应用程序。
Prism库是开发大型应用程序的首选:

  1. 模块化设计:Prism库采用模块化设计,允许开发人员将应用程序分解为独立的模块,每个模块都有自己的功能和界面。这种设计使得应用程序更易于扩展和维护。

  2. MVVM模式:Prism库采用MVVM模式,将应用程序的逻辑和界面分离,使得开发人员可以专注于业务逻辑的实现,而不必担心界面的细节。这种模式也使得应用程序更易于测试和调试。

  3. 事件聚合器:Prism库提供了一个事件聚合器,允许模块之间通过事件进行通信。这种设计使得应用程序的各个模块之间更加松散耦合,提高了应用程序的可扩展性和可维护性。

  4. 依赖注入:Prism库采用依赖注入,将应用程序的各个部分解耦,使得它们可以独立开发、测试和部署。这种设计也提高了应用程序的可测试性和可维护性。

Prism库使用场景

Prism 库通常用于大型桌面应用程序和移动应用程序的开发,可以帮助构建具有高可扩展性和可测试性的应用程序。例如:

• 实现MVVM模式,简化UI和业务逻辑之间的交互,提高代码的可维护性和可扩展性。

• 提供依赖注入(DI)容器,可以轻松地实现对象的管理和交互,减少重复的代码和提高代码的复用性。

• 提供导航服务,可以实现应用程序中页面之间的导航和传递参数,简化应用程序的开发和维护。

• 提供事件聚合器,可以实现应用程序中不同模块之间的通信和事件处理,降低耦合度,提高代码的灵活性和可测试性。

• 支持区域管理,可以将应用程序分成多个区域,在不同的区域中加载不同的视图和功能模块,实现应用程序的可插拔特性。

• 提供命令绑定机制,可以快速绑定UI控件和命令,并帮助开发人员实现复杂的UI交互和业务逻辑。

• 提供模块化开发支持,可以将应用程序拆分成多个独立的模块,每个模块可以包含不同的视图、视图模型和服务,实现团队协作和代码复用。

学习Prism库需要掌握以下前置知识:

  1. 基本的C#编程语言知识,包括面向对象编程、委托、事件、泛型等。

  2. 熟悉WPF(Windows Presentation Foundation)框架,了解XAML(eXtensible Application Markup Language)标记语言。

  3. 对MVVM(Model-View-ViewModel)架构有一定的理解和实践经验。

  4. 熟悉IoC(Inversion of Control)和依赖注入(Dependency Injection)的概念和实现方式。

  5. 熟悉设计模式,特别是观察者模式、命令模式、状态模式、策略模式和工厂模式等。

  6. 熟悉.NET Framework的基础类库和相关工具,如LINQ(Language Integrated Query)、Task Parallel Library等。

  7. 熟悉异步编程和多线程编程的概念和实践经验。

  8. 熟悉Windows操作系统和应用程序开发的相关知识,如进程、线程、消息机制等。

Prism库的组件模块

Prism.Core

Prism.Core 是 Prism 库的核心组件,提供了 ViewModel 层和模块化应用程序开发所需的工具和服务。其中包括:
• 依赖注入容器:Prism 内置了一些常见的依赖注入容器,并支持其他第三方容器的集成;

• 命令:提供了基于 ICommand 接口的 Command 类型及其相关实现;

• 事件聚合器:提供了一种机制来实现不同组件(ViewModel 或 View)之间的松散耦合通信;

• 模块化开发:提供了基于模块的应用程序开发支持,其中每个模块都是一个独立的功能单元。

Prism.Wpf

Prism.Wpf 提供了 WPF 应用程序开发所需的特定工具和服务,包括:

• 基础设施:提供了与 WPF 应用程序相关的基础设施,例如 Region 和 Navigation;

• 对话框:提供了实现对话框的支持;

• 应用程序生命周期管理:提供了一种机制来管理应用程序的生命周期;

• 交互式用户界面:提供了支持 MVVM 架构模式的附加控件和服务。

Prism.Forms

Prism.Forms 提供了与 Xamarin.Forms 应用程序相关的特定工具和服务,包括:

• 命令:提供了可在 ViewModel 中使用的命令类型;

• 导航:提供了导航服务和支持;

• 事件聚合器:提供了一种机制来实现不同组件(ViewModel 或 View)之间的松散耦合通信。

Prism库的优点和缺点

优点

• 高度可扩展性:使用 Prism 的模块化架构可以轻松扩展应用程序;

• 易于测试:依赖注入容器和可测试的命令模式可以使应用程序易于测试;

• 良好的文档和社区支持:Prism 有丰富的文档和良好的社区支持,开发者可以在社区中寻求帮助或分享解决方案。

缺点

• 学习曲线:Prism 有一定的学习曲线,需要熟悉其模块化开发、依赖注入和命令模式等相关概念;
• 过于复杂:对于小型应用程序来说,使用 Prism 可能会过于复杂。

使用WPF代码案例介绍Prism库用法

下面是一个简单的 WPF 示例,展示了如何使用 Prism 库:

引入Prism相关依赖库

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>WinExe</OutputType><TargetFramework>net8.0-windows</TargetFramework><Nullable>enable</Nullable><ImplicitUsings>enable</ImplicitUsings><UseWPF>true</UseWPF></PropertyGroup><ItemGroup><PackageReference Include="Prism.Core" Version="9.0.537" /><PackageReference Include="Prism.DryIoc" Version="9.0.537" /><PackageReference Include="Prism.Wpf" Version="9.0.537" /></ItemGroup>
</Project>

添加本地日志服务

ILogger.cs:

public interface ILogger
{void Log(string message);
}using System.Diagnostics;

ConsoleLogger.cs:

public class ConsoleLogger : ILogger
{public void Log(string message){Trace.WriteLine(message);}
}

配置MainView页面和MainViewModelView

MainWindow.xaml

<Window x:Class="MyWpfApp.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:MyWpfApp"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800"><Grid><Button Command="{Binding ShowMessageCommand}" Name="btn"  Width="100" Height="40" HorizontalAlignment="Center" VerticalAlignment="Center" >btnShow</Button></Grid>
</Window>

MainWindow.xaml.cs

public partial class MainWindow : Window
{public MainWindow(){InitializeComponent();}
}

MainWindowViewModel.cs:

public class MainWindowViewModel : BindableBase
{private readonly ILogger _logger;public MainWindowViewModel(ILogger logger){_logger = logger;}private string _message = "Hello, Prism!";public string Message{get => _message;set => SetProperty(ref _message, value);}private ICommand _showMessageCommand;public ICommand ShowMessageCommand{get{if (_showMessageCommand == null){_showMessageCommand = new DelegateCommand(() =>{_logger.Log($"User clicked ShowMessage button. Message: {Message}");MessageBox.Show(Message);});}return _showMessageCommand;}}
}

配置Prism引用和App依赖注入

<prism:PrismApplication x:Class="MyWpfApp.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:MyWpfApp"xmlns:prism="http://prismlibrary.com/"><Application.Resources>         </Application.Resources>
</prism:PrismApplication>

App.xaml.cs

using System.Windows;namespace MyWpfApp
{public partial class App : PrismApplication{protected override void RegisterTypes(IContainerRegistry containerRegistry){// 在依赖注入容器中注册服务containerRegistry.Register<ILogger, ConsoleLogger>();containerRegistry.RegisterForNavigation<MainWindow, MainWindowViewModel>();}protected override Window CreateShell(){// 创建主窗口return Container.Resolve<MainWindow>();}}
}

执行代码


Prism库插件机制

Prism库可以通过源码插件机制,将大型应用程序分解成多个小模块,以实现团队协作、代码重用和功能扩展等目的。下面介绍一下Prism库源码插件机制的实现步骤,并给出一个简单的示例:

创建接口:定义一个接口,例如ITargetAssemblyLocator,用于查找需要加载的插件程序集。

public interface ITargetAssemblyLocator
{IEnumerable<Assembly> GetAssemblies();
}

实现接口:创建一个类,实现ITargetAssemblyLocator接口并重写GetAssemblies方法,以实现查找并返回需要加载的插件程序集列表的逻辑。
例如:

public class MyPluginAssemblyLocator : ITargetAssemblyLocator
{public IEnumerable<Assembly> GetAssemblies(){// 查找指定目录中的所有插件程序集并返回var pluginDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins");var assemblies = Directory.GetFiles(pluginDirectory, "*.dll", SearchOption.AllDirectories).Select(f => Assembly.LoadFrom(f));return assemblies;}
}

注册插件信息:在应用程序的启动代码中,使用Prism框架提供的RegisterPluginTypes方法来注册插件信息。

var pluginLocator = new MyPluginAssemblyLocator();
var pluginCatalog = new AssemblyCatalog(pluginLocator.GetAssemblies().ToArray());
var aggregateCatalog = new AggregateCatalog();
aggregateCatalog.Catalogs.Add(pluginCatalog);
var container = new UnityContainer();
var moduleManager = new ModuleManager(container, aggregateCatalog);
moduleManager.Run();1. 实现插件:创建一个或多个项目,为每个插件项目引用Prism库,并实现相应的插件功能和业务逻辑。public class MyPluginModule : IModule
{private readonly IRegionManager _regionManager;public MyPluginModule(IRegionManager regionManager){_regionManager = regionManager;}public void Initialize(){var myView = new MyPluginView();var myViewModel = new MyPluginViewModel();myView.DataContext = myViewModel;_regionManager.RegisterViewWithRegion("MyPluginRegion", () => myView);}
}

部署插件:将插件程序集复制到指定目录,使其可被应用程序加载。例如,将插件程序集复制到Plugins目录下。通过Prism库源码插件机制,可以将应用程序分解成多个小模块,以实现功能扩展和代码重用等目的。在示例中,通过实现ITargetAssemblyLocator接口,查找并返回需要加载的插件程序集列表,然后使用Prism框架提供的方法注册插件信息,并启动应用程序。最后,创建一个或多个插件项目,实现相应的插件功能和业务逻辑。

总结Prism库

Prism 库是一个强大的工具和库,可以帮助开发者构建具有高可扩展性和可测试性的应用程序。它提供了模块化架构、依赖注入和命令模式等诸多功能,并且提供了良好的文档和社区支持。但是,对于小型应用程序来说,使用Prism库可能会过于复杂,需要考虑到开发的规模和需求来决定是否使用 Prism。

资料参考

• Prism官方文档:https://prismlibrary.com/docs/

• GitHub源代码地址:https://github.com/PrismLibrary

• Prism示例程序:https://github.com/PrismLibrary/Prism-Samples-Wpf

• Prism视频教程:https://www.pluralsight.com/courses/prism-introduction

原创 dotnet研习社

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

读数据保护:工作负载的可恢复性04备份与档案

备份与档案1. 区分备份与档案 1.1. 两个完全不同的操作1.1.1. 要实现的是两个完全不同的目标1.1.2. 备份(backup)1.1.3. 档案(archive)1.2. 有些产品既能制作备份,又能制作档案 1.3. 某些产品或服务明明是专门用…

攻防世界:Crypto习题之easy_RSA

攻防世界:Crypto习题之easy_RSA RSA 加密 在非对称加密算法中,单向函数被广泛应用,用于确保从公钥加密后的密文无法轻易推导出私钥,从而保证数据的安全性。而其中最著名的算法便是 RSA 加密算法。 首先设 $$\varphi(m) := | { 1 \leq k \leq m |\gcd(k, m) = 1 } |$$ 为欧…

HCIP-23 IGMP原理与配置

IGMP的主要作用是让组播网络感知组播组成员的位置和所加组播组,同时也能维护组成员的加组状态。 IGMP有三种版本: IGMPv1:有基本的加组机制,但是组成员离开机制较为落后,同时没有独立的IGMP查询器选举机制。 IGMPv2:在IGMPv1的基础上改善了组成员离开机制,同时拥有了独立…

acwing语法基础课总结(未完结)

题单 https://www.acwing.com/activity/content/10/ 1>基础概念 权重(609) 和比列不同,例如A的成绩是90,权重为3.5;B的成绩是95,权重是7.5平均成绩就是(90 * 3.5 + 95 * 7.5) * 1.0 / (3.5 + 7.5) pow函数 返回值类型为double类型 取整函数ceil函数 向上取整 头文件 cma…

苹果im虚拟机系统,苹果imessage推信软件,苹果iMessage自动群发协议–持续更新中...

一、电脑版虚拟机苹果系统(Mac OS)上实现imessage群发: /*MacOS苹果系统,正常情况下,只能安装到苹果公司自己出品的Mac电脑,俗称白苹果,不能安装到各种组装机或者其他品牌的品牌机上,黑苹果的的原理,就是通过一些“破解补丁” 工具欺骗macOS系统,让苹果系统认为你的电脑其…

上穷碧落下黄泉

上穷碧落下黄泉,动手动脚找东西。——傅斯年 《黄泉下的美术》真好看吧,巫鸿老师我将追随你我的朋友很喜欢送给我“安安心心”这个词我也会幻想我只需要当个浸在瑰色梦中的小公主一个只需要安安心心在知识的海洋里行走的学者但幻想只是幻想啊,与现实有着无可避免的距离我很不…

高效沟通的密码:PREP 沟通表达模型 - 1、观点 2、依据 3、事例 4、重述观点

PREP 沟通模型介绍 PREP 沟通模型是一种用于有效沟通和表达观点的结构化方法。它由四个部分组成,分别是Point 观点 Reason 依据 Example 事例 Point 重述观点PREP 把表达过程分成四个步骤:先说观点,再说依据,举事例说明,最后在重述观点。1、PREP 沟通模型先提出观点,让听…

一分钟了解不同架构的优缺点

单体应用架构(Monolithic Architecture) 1968 年的软件危机产生了软件工程,并且催生了面向对象的高级语言,例如 1972 的 C 语言,同时产生了我们的单体式的技术架构。 单体应用架构是一种传统的应用架构模式,也是至今为止,一直被大规模使用的一种方式,是将应用程序作为一…

记录一个比较难找的封装端子A1257WV----来自达妙的电机驱动板

起因 想设计一个CAN总线的转接板,奈何这个端子实在是太过于抽象了,以至于连封装都很难找, 这里浅浅的记录一下下。 正文 这个在嘉立创搜叫: A1257WV-S-4P-LCP 其中里面的4P代表的意思是四个引脚这东西还有立式和卧式,买的时候注意区分在原理图里面是这个样子的:感觉这种段…

STM32F103 PWM配置

在《STM32F103定时器配置》中我们介绍了PWM的产生原理,本节介绍介绍如何编码实现PWM的输出。 一、PWM相关寄存器 TIMx如果要产生PWM,除了我们上一节提到的如下寄存器:控制寄存器(TIMx_CR1); DMA/中断使能寄存器(TIMx_DIER); 预分频寄存器(TIMx_PSC); 从模式控制寄存…

gitlab实现https及管理员密码找回

作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 目录一.gitlab实现https1.实现https概述2.gitlab实现https实战案例二.找回gitlab忘记的密码(可用于破解别人的gitlab服务器)1.官方文档2.实战案例 一.gitlab实现https 1.实现https概述 gitlab如果用于不安全的…

2024CCPC长春邀请赛VP D,EG,L

L. Recharge给你三个整数,k,x,y。。x和y分别代表x个1和y个2 问你最多能凑出几个k 我们只需要考虑是否会出现浪费2的情况比如k=3 你此时没有1就只能用两个2来凑出这个3,这样就会浪费1. 我们把k分成奇偶数来看,如果k是偶数,那么百分百不会出现浪费,只需要把(y*2+x)/k就能得到…