• Prism框架的Module(模块化)编程


    Prism框架用的是新版本的,Prism7.1。关于其中的变动,感兴趣的参考https://www.cnblogs.com/hicolin/p/8694892.html

    如何告诉Shell(我们的宿主程序)去Load哪些Module,Prism框架用的是模块目录ModuleCatalog,ModuleCatalog包含了可以被APP使用的模块信息。

    方式一:通过配置文件(App.config)创建模块目录(ModuleCatalog)

    1、新建Prism Blank App(WPF) 项目:BlankApp7

    BlankApp7处鼠标右键——添加——新建项——应用程序配置文件,App.config

    2、新建Prism Module(WPF)项目:ModuleA

    3、ModuleA中有个ModuleAModule.cs文件,实现ViewA与主窗体的ContentRegion的关联(四种方式的ModuleAModule.cs内容都一样)

    using ModuleA.Views;
    using Prism.Ioc;
    using Prism.Modularity;
    using Prism.Regions;
    
    namespace ModuleA
    {
        public class ModuleAModule : IModule
        {
            public void OnInitialized(IContainerProvider containerProvider) 
            {
                var regionManager = containerProvider.Resolve<IRegionManager>();
                regionManager.RegisterViewWithRegion("ContentRegion", typeof(ViewA)); //viewA与ContentRegion进行关联
            }
            public void RegisterTypes(IContainerRegistry containerRegistry)
            {
                
            }
        }
    }

    App.xaml.cs目录创建于配置文件

    using BlankApp7.Views;
    using Prism.Ioc;
    using Prism.Modularity;
    using System.Windows;
    
    namespace BlankApp7
    {
        public partial class App
        {
            protected override Window CreateShell()
            {
                return Container.Resolve<MainWindow>();
            }
            protected override void RegisterTypes(IContainerRegistry containerRegistry)
            {
            }
            protected override IModuleCatalog CreateModuleCatalog() 
            {
                return new ConfigurationModuleCatalog(); //目录创建于配置文件
            }
        }
    }

    配置文件App.config,可知有一个名为ModuleAModule的Module,集合于ModuleA.dll中,startupLoaded是否在启动时就加载(显示)。

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <configSections>
            <section name="modules" type="Prism.Modularity.ModulesConfigurationSection, Prism.Wpf" />
        </configSections>
        <modules>        
            <module assemblyFile="ModuleA.dll" moduleType="ModuleA.ModuleAModule, ModuleA" moduleName="ModuleAModule" startupLoaded="True" />
        </modules>
    </configuration>

    4、由于BlankApp7要加载ModuleA,所以要引用ModuleA生成的dll。

    ModuleA处鼠标右键——生成,ModuleA的bin文件夹中就会出现ModuleA.dll

    BlankApp7处鼠标右键——添加——引用,浏览,找到ModuleA.dll(不建议复制粘贴dll到BlankApp7的bin目录,因为如果重新生成ModuleA.dll,那么新的dll不会出现在BlankApp7的bin目录,依旧是拷贝的旧dll)

    运行结果如图

     方式二:Code方法,调用AddModule()

    仿照方式一创建项目BlankApp8、ModuleA,只需要更改ModuleAModule.cs、App.xaml.cs。其他文件默认不动。

    ModuleAModule.cs,内容与方式一一样

    App.xaml.cs

    using BlankApp8.Views;
    using Prism.Ioc;
    using Prism.Modularity;
    using System.Windows;
    
    namespace BlankApp8
    {
        public partial class App
        {
            protected override Window CreateShell()
            {
                return Container.Resolve<MainWindow>();
            }
            protected override void RegisterTypes(IContainerRegistry containerRegistry)
            {
            }
            protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog) //配置模块目录
            {
                moduleCatalog.AddModule<ModuleA.ModuleAModule>(); //使用AddModule方法
            }
        }
    }

    运行时,依然按照方式一的第4步骤生成并引用dll。

     方式三:指定dll所在目录的方式,因此就不用按照方式一的第4步骤生成并引用dll了。

    与方式二一样,只需要更改两个文件ModuleAModule.cs、App.xaml.cs。ModuleAModule.cs内容与方式一一样。

    App.xaml.cs指定要加载的dll的目录

    using BlankApp8.Views;
    using Prism.Ioc;
    using Prism.Modularity;
    using System.Windows;
    
    namespace BlankApp8
    {
        public partial class App
        {
            protected override Window CreateShell()
            {
                return Container.Resolve<MainWindow>();
            }
            protected override void RegisterTypes(IContainerRegistry containerRegistry)
            {
            }
            protected override IModuleCatalog CreateModuleCatalog()
            {
                //return new DirectoryModuleCatalog() { ModulePath = @"./" }; //当前目录,即BlankApp8BlankApp8inDebug。需拷贝ModuleA.dll到当前目录中
                return new DirectoryModuleCatalog() { ModulePath = @"C:Usersjvsource
    eposBlankApp8ModuleAinDebug" };//不拷贝ModuleA.dll,使用绝对目录
            }
        }
    }

    方式四:加载模块的方式,与方式一同样可以实现内容的显示与否。

    只需要更改两个文件ModuleAModule.cs、App.xaml.cs。ModuleAModule.cs内容与方式一一样。

    App.xaml.cs

    using BlankApp8.Views;
    using ModuleA; //引入ModuleA
    using Prism.Ioc;
    using Prism.Modularity;
    using System.Windows;
    
    namespace BlankApp8
    {
        public partial class App
        {
            protected override Window CreateShell()
            {
                return Container.Resolve<MainWindow>();
            }
            protected override void RegisterTypes(IContainerRegistry containerRegistry)
            {
            }
            protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
            {
                var moduleAType = typeof(ModuleAModule);
                moduleCatalog.AddModule(new ModuleInfo()
                {
                    ModuleName = moduleAType.Name,
                    ModuleType = moduleAType.AssemblyQualifiedName,
                    InitializationMode = InitializationMode.WhenAvailable //显示View内容
                    //InitializationMode = InitializationMode.OnDemand //不显示View内容
                });
            }
        }
    }

    运行时,依然按照方式一的第4步骤生成并引用dll。

  • 相关阅读:
    [翻译] 编写高性能 .NET 代码--第五章 通用编码与对象设计 -- 类 vs 结构体
    [翻译] 编写高性能 .NET 代码--第二章 GC -- 配置选项
    [翻译]编写高性能 .NET 代码 第二章:垃圾回收 基本操作
    [翻译]编写高性能 .NET 代码 第二章:垃圾回收
    [翻译]编写高性能 .NET 代码 第一章:工具介绍 -- Visual Studio
    [翻译]编写高性能 .NET 代码 第一章:工具介绍 -- Performance Counters(性能计数器)
    [翻译]编写高性能 .NET 代码 第一章:性能测试与工具 -- 平均值 vs 百分比
    [翻译]编写高性能 .NET 代码 第一章:性能测试与工具 -- 选择什么来衡量
    NGUI锚定系统:UIAnchorUIRect
    NGUI Panel裁剪、层级实现原理
  • 原文地址:https://www.cnblogs.com/xixixing/p/11488218.html
Copyright © 2020-2023  润新知