C# Prism核心特性解析
·
Prism 是一个用于在 .NET 中构建松耦合、可维护且可测试的 XAML 应用程序的开源框架,它基于设计模式(如 MVVM、依赖注入、命令、事件聚合器等)。以下是其核心概念、优势及一个基础入门示例。
Prism 核心特性与优势
| 特性 | 说明 | 解决的问题/优势 |
|---|---|---|
| 模块化 | 应用程序被分解为多个独立的模块,可以单独开发、测试和部署。 | 提升大型项目的可维护性、可扩展性和团队协作效率。 |
| 依赖注入 (DI) | 内置对 Unity 等容器的支持,用于管理服务与视图模型的依赖关系。 | 实现松耦合,便于单元测试和替换实现。 |
| 导航 | 提供区域 (Region) 管理和导航服务,实现视图的动态加载与切换。 | 解耦视图切换逻辑与具体视图,使 UI 组合更灵活。 |
| 事件聚合器 | 一种发布/订阅机制,允许模块间进行松散的通信。 | 模块间无需直接引用,降低耦合度。 |
| MVVM 模式支持 | 提供 BindableBase、DelegateCommand 等类,简化 ViewModel 开发。 |
清晰分离 UI 逻辑与业务逻辑,提升可测试性。 |
基础入门:创建一个简单的 Prism WPF 应用
以下步骤展示如何使用 Prism 和 Unity 容器创建一个最基本的 WPF 应用。
1. 创建项目并安装 NuGet 包
创建一个新的 WPF 应用项目,然后通过 NuGet 包管理器安装以下包:
Prism.Unity(此包通常会自动引入Prism.Core和Prism.Wpf)
2. 修改 App.xaml
删除 StartupUri,并修改 Application 的基类为 PrismApplication。
<!-- App.xaml -->
<prism:PrismApplication x:Class="PrismDemo.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/">
<Application.Resources>
</Application.Resources>
</prism:PrismApplication>
3. 修改 App.xaml.cs
重写 CreateShell 和 RegisterTypes 方法。
// App.xaml.cs
using Prism.Ioc;
using Prism.Unity;
using System.Windows;
namespace PrismDemo
{
public partial class App : PrismApplication
{
// 创建应用程序的主窗口 protected override Window CreateShell()
{
// 从容器中解析主窗口(Shell)
return Container.Resolve<MainWindow>();
}
// 在此注册类型到依赖注入容器 protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
// 示例:注册一个服务
// containerRegistry.Register<IMyService, MyService>();
}
}
}
4. 设置主窗口 (Shell) 和区域
在 MainWindow.xaml 中,使用 Prism 的区域 (RegionManager) 来定义可动态加载内容的区域。
<!-- MainWindow.xaml -->
<Window x:Class="PrismDemo.MainWindow"
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 Demo" Height="350" Width="525">
<Grid>
<!-- 定义一个名为“ContentRegion”的区域 -->
<ContentControl prism:RegionManager.RegionName="ContentRegion" />
</Grid>
</Window>
5. 创建模块、视图和 ViewModel
- ViewModel:继承
BindableBase,实现属性通知。
// ViewModels/MainViewModel.cs
using Prism.Commands;
using Prism.Mvvm;
namespace PrismDemo.ViewModels
{
public class MainViewModel : BindableBase
{
private string _message = "Hello Prism!";
public string Message
{
get { return _message; }
set { SetProperty(ref _message, value); }
}
private DelegateCommand _clickCommand;
public DelegateCommand ClickCommand =>
_clickCommand ?? (_clickCommand = new DelegateCommand(ExecuteClick));
private void ExecuteClick()
{
Message = "Button Clicked!";
}
}
}
- View:一个 UserControl,其
DataContext将通过 Prism 自动绑定到对应的 ViewModel。
<!-- Views/MainView.xaml -->
<UserControl x:Class="PrismDemo.Views.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock Text="{Binding Message}" FontSize="24" Margin="10"/>
<Button Content="Click Me" Command="{Binding ClickCommand}" Width="100" Height="30"/>
</StackPanel>
</UserControl>
// Views/MainView.xaml.cs
using System.Windows.Controls;
namespace PrismDemo.Views
{
public partial class MainView : UserControl
{
public MainView()
{
InitializeComponent();
}
}
}
6. 在应用启动时导航到视图
在 App.xaml.cs 的 OnInitialized 方法中,使用 IContainerProvider 解析 IRegionManager,并将视图导航到主窗口的区域中。
// App.xaml.cs (补充)
using Prism.Regions;
namespace PrismDemo
{
public partial class App : PrismApplication {
// ... 之前的 CreateShell 和 RegisterTypes 方法 ...
protected override void OnInitialized()
{
base.OnInitialized();
// 获取主窗口实例 var shellWindow = Container.Resolve<MainWindow>();
// 获取区域管理器
var regionManager = Container.Resolve<IRegionManager>();
// 将 MainView 注册到 ContentRegion // 这里使用了 View Discovery(视图发现)的方式
regionManager.RegisterViewWithRegion("ContentRegion", typeof(Views.MainView));
// 显示主窗口 shellWindow.Show();
}
}
}
运行此应用程序,你将看到一个显示“Hello Prism!”和按钮的窗口,点击按钮文本会更新。这个简单的例子涵盖了 Prism 应用的启动流程、区域管理和基本的 MVVM 数据绑定。对于更复杂的模块化开发、导航和事件聚合等高级特性,可以参考 Prism 的官方文档和更详细的教程。
参考来源
更多推荐
所有评论(0)