C# WPF prism 桌面开发基础——模块

什么是模块化开发

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";
        }
    }
}

点击后的效果
在这里插入图片描述

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值