什么是模块化开发
Prism支持模块化开发,可以将应用程序分解为多个独立的模块,并且动态地加载和卸载它们。这有助于提高代码的组织和可扩展性。
模块化开发是一种将程序分解为一组独立但可相互通信的功能单元(模块)的方法。这些模块可以独立地进行开发、测试、部署和扩展,从而提高代码的可维护性和可扩展性。在模块化开发中,每个模块封装应用程序的特定功能或服务,并具有清晰的接口,以便其他模块可以与之交互。模块化开发的核心思想是将程序划分为一系列松散耦合的模块,每个模块专注于实现应用程序的特定功能或服务。模块之间的通信通过定义清晰的接口来实现,这些接口定义了模块之间的输入和输出。这有助于降低模块间的耦合度,使每个模块可以在不影响其他模块的情况下进行修改和扩展。
在模块化开发中,每个模块可以独立进行开发和测试。这有助于提高开发效率,减少代码冲突和错误,并使得代码更容易理解和维护。此外,模块化开发还使得应用程序更容易进行部署和扩展。例如,可以将一些模块设计为可插拔的组件,以便在需要时替换或升级。
为了实现模块化开发,需要遵循一些最佳实践和原则。例如,应该尽量减少模块间的耦合度,使每个模块具有清晰定义的职责和边界。此外,应该使用适当的模块化框架或库来帮助管理模块的依赖关系和通信。在C#中,可以使用Prism框架等工具来实现模块化开发。
总之,模块化开发是一种将程序划分为一系列松散耦合的模块的方法,有助于提高代码的可维护性和可扩展性。通过遵循一些最佳实践和原则,可以使用适当的框架或库来帮助实现模块化开发。
创建模块
上面是AI写的,扯的有点多,下面直接上代码。
这里使用按照业务区分模块的方式,首先来创建一个系统管理模块,把之前挤在主模块里的用户管理,部门管理啥的都分出来。
还是之前文章中创建好的模板,找到Modules文件夹,右键->添加->新建项目,找到Prism Module(WPF)
注意修改默认的项目名称和位置(咱就按照模板的例子来嘛,照样画葫芦不怕出错,当然也能自定义位置,这个不重要)
模块内容填充
删掉前文创建的几个视图(页面,view,区域怎么叫都可以,反正就那个东西),在SystemManage模块中重新创建,并注册到prism容器中
可以先删掉默认创建的ViewA和ViewAViewModel
老规矩,右键->添加->新建项->Prism UserControl
创建完所需的视图后目录是这个样子的
修改SystemManageModule.cs文件,将页面注册到prism容器中
using AppManager.Modules.SystemManage.Views;
using Prism.Ioc;
using Prism.Modularity;
using Prism.Regions;
namespace AppManager.Modules.SystemManage
{
public class SystemManageModule : IModule
{
public void OnInitialized(IContainerProvider containerProvider)
{
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterForNavigation<DeptManage>("DeptView");
containerRegistry.RegisterForNavigation<UserManage>("UserView");
containerRegistry.RegisterForNavigation<PowerManage>("PowerView");
}
}
}
不用管OnInitialized,它是在模块初始化结束后执行的操作,如果是主页的话,可以参考默认模板中的代码
using AppManager.Core;
using AppManager.Modules.ModuleName.Views;
using Prism.Ioc;
using Prism.Modularity;
using Prism.Regions;
namespace AppManager.Modules.ModuleName
{
public class ModuleNameModule : IModule
{
private readonly IRegionManager _regionManager;
public ModuleNameModule(IRegionManager regionManager)
{
_regionManager = regionManager;
}
public void OnInitialized(IContainerProvider containerProvider)
{
_regionManager.RequestNavigate(RegionNames.ContentRegion, "ViewA");
}
public void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterForNavigation<ViewA>();
}
}
}
这里是将RegionNames.ContentRegion显示为ViewA
引用模块
模块做完以后,先在主模块引用模块所在的项目
在AppManager上右键->添加->项目引用,把刚才创建的SystemManage模块勾上
然后修改App.xaml.cs
在ConfigureModuleCatalog函数中添加一个模块
修改完之后的App.xaml.cs是这样的
using AppManager.Modules.ModuleName;
using AppManager.Modules.SystemManage;
using AppManager.Services;
using AppManager.Services.Interfaces;
using AppManager.Views;
using Prism.Ioc;
using Prism.Modularity;
using System.Windows;
namespace AppManager
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App
{
protected override Window CreateShell()
{
return Container.Resolve<MainWindow>();
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterSingleton<IMessageService, MessageService>();
}
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
moduleCatalog.AddModule<ModuleNameModule>();
moduleCatalog.AddModule<SystemManageModule>();
}
}
}
这样就注册完模块了,启动下看看效果,再贴一遍主页的代码,以及跳转后页面的代码
<Window
x:Class="AppManager.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:core="clr-namespace:AppManager.Core;assembly=AppManager.Core"
xmlns:prism="http://prismlibrary.com/"
Title="{Binding Title}"
Width="525"
Height="350"
prism:ViewModelLocator.AutoWireViewModel="True">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<StackPanel>
<Button
Margin="5"
Command="{Binding NavigateCommand}"
CommandParameter="UserView">
用户管理
</Button>
<Button
Margin="5"
Command="{Binding NavigateCommand}"
CommandParameter="DeptView">
部门管理
</Button>
<Button
Margin="5"
Command="{Binding NavigateCommand}"
CommandParameter="PowerView">
菜单管理
</Button>
</StackPanel>
<ContentControl Grid.Column="1" prism:RegionManager.RegionName="{x:Static core:RegionNames.ContentRegion}" />
</Grid>
</Window>
<UserControl x:Class="AppManager.Modules.SystemManage.Views.UserManage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True">
<Grid>
<TextBlock Text="{Binding Message}"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="24"/>
</Grid>
</UserControl>
using Prism.Commands;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Linq;
namespace AppManager.Modules.SystemManage.ViewModels
{
public class UserManageViewModel : BindableBase
{
private string _message;
public string Message
{
get { return _message; }
set { SetProperty(ref _message, value); }
}
public UserManageViewModel()
{
Message = "UserView from SystemManageModule";
}
}
}
点击后的效果