首页 > 其他分享 >2.Prism框架ModuleAttribute、IOC扩展、功能注册

2.Prism框架ModuleAttribute、IOC扩展、功能注册

时间:2024-02-04 09:12:08浏览次数:23  
标签:container ModuleAttribute type Prism static 模块 var IOC public

ModuleAttribute(按需延迟加载)

ModuleAttribute 是 Prism 框架中用于标识模块的属性。通过使用 ModuleAttribute,可以将模块与特定的模块目录进行关联,从而使 Prism 应用程序能够动态加载和初始化模块。

在使用 WPF ModuleAttribute 时,需要将该属性应用于模块类,并指定模块的模块目录路径。例如:

ModuleName:获取或设置模块的名称

OnDemand:获取或设置指示是否应按需加载模块的值。

StartupLoaded :获取或设置一个值,该值指示是否应在启动时加载模块

[Module(ModuleName = "MyModule", OnDemand = true)]
public class MyModule : IModule
{
    // 模块的初始化和加载逻辑
}

利用特性和反射向IOC容器中注册服务

案列:

自动初始化特性:

/// <summary>
    /// 标注类型的生命周期是否自动初始化
    /// AttributeTargets.Class自定义特性的对象
    /// AllowMultiple :是否允许被多次使用
    /// </summary>
    [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
    public class ExposedServiceAttribute : Attribute
    {
        public Lifetime LiftTime { get; set; }
        public bool AutoInitialize { get; set; }
        public Type[] Types { get; set; }

        public ExposedServiceAttribute(Lifetime liftTime = Lifetime.Transient, params Type[] types)
        {
            LiftTime = liftTime;
            Types = types;
        }
    }
public enum Lifetime
    {
        /// <summary>
        /// 单列
        /// </summary>
        Singleton,
        /// <summary>
        /// 多列
        /// </summary>
        Transient
    }

AttributeUsage 描述了如何使用一个自定义特性类。它规定了特性可应用到的项目的类型。

规定该特性的语法如下:

[AttributeUsage(
   validon,
   AllowMultiple=allowmultiple,
   Inherited=inherited
)]
validon:自定义特性的对象,可以是类、方法、属性等对象(默认值是 AttributeTargets.All)
AllowMultiple:是否允许被多次使用(默认值为false:单用的)
Inherited:是否可被派生类继承(默认值为false:不能)


依赖注入扩展类:
加载模块时,实例化标注为ExposedServiceAttriubute特性的类
/// <summary>
    /// 加载模块时,实例化标注为ExposedServiceAttriubute特性的类
    /// </summary>
    public static class DependencyExtension
    {


        private static List<Type> GetTypes(Assembly assembly)
        {
            var result = assembly.GetTypes().Where(t => t != null && t.IsClass && !t.IsAbstract &&
            t.CustomAttributes.Any(p => p.AttributeType == typeof(ExposedServiceAttribute))).ToList();

            return result;
        }


        /// <summary>
        /// 扩展IContainerRegistry接口的注册类型的功能
        /// </summary>
        /// <param name="container"></param>
        /// <param name="assembly"></param>
        public static void RegisterAssembly(this IContainerRegistry container, Assembly assembly)
        {
            var list = GetTypes(assembly);

            foreach (var type in list)
            {
                RegisterAssembly(container, type);
            }
        }


        private static IEnumerable<ExposedServiceAttribute> GetExposedServices(Type type)
        {
            var typeInfo = type.GetTypeInfo();
            return typeInfo.GetCustomAttributes<ExposedServiceAttribute>();
        }

        public static void RegisterAssembly(IContainerRegistry container, Type type)
        {
            var list = GetExposedServices(type).ToList();

            foreach (var item in list)
            {
                if (item.LiftTime == Lifetime.Singleton)
                {
                    container.RegisterSingleton(type);//注册单例
                }

                foreach (var IType in item.Types)
                {
                    if (item.LiftTime == Lifetime.Singleton)
                    {
                        container.RegisterSingleton(IType, type);//以接口注册单例
                    }
                    else if (item.LiftTime == Lifetime.Transient)
                    {
                        container.Register(IType, type);//以接口注册多例
                    }
                }
            }
        }




        /// <summary>
        /// 初始化程序集中所有标注为ExposedServiceAttriubute特性的类,要求单例具自动加载AutoInitialize=true
        /// </summary>
        /// <param name="container"></param>
        /// <param name="assembly"></param>
        public static void InitializeAssembly(this IContainerProvider container, Assembly assembly)
        {
            var list = GetTypes(assembly);

            foreach (var item in list)
            {
                InitializeAssembly(container, item);
            }
        }

        private static void InitializeAssembly(IContainerProvider container, Type type)
        {
            var list = GetExposedServices(type);

            foreach (var item in list)
            {
                if (item.LiftTime == Lifetime.Singleton && item.AutoInitialize)
                {
                    container.Resolve(type);
                }
            }
        }
    }

 

图片模块IModule中配置,意思是在加载这个模块的时候会自动注册和初始化带有该模块中有ExposedServiceAttribute 特性的类

[Module(ModuleName = ModuleName.ImageModuleProfile, OnDemand = true)]
    public class ImageModuleProfile : IModule
    {
        public void OnInitialized(IContainerProvider containerProvider)
        {
            containerProvider.InitializeAssembly(Assembly.GetExecutingAssembly());
            containerProvider.Resolve<IRegionManager>().RegisterViewWithRegion<ImageView>(ContentControlName.MainmoduleImagemoduleReginName);
        }

        public void RegisterTypes(IContainerRegistry containerRegistry)
        {
            containerRegistry.RegisterAssembly(Assembly.GetExecutingAssembly());
            containerRegistry.RegisterForNavigation<ImageView, ImageViewModel>();
        }
    }

 

使用:

/// <summary>
    /// 显示16位探测器图像的模型
    /// </summary>
    [ExposedService(Lifetime.Singleton, typeof(IDetectorDisplayModel))]
    public class DetectorDisplayModel : IDetectorDisplayModel
    {

    }

 

上面我们知道了如何利用特性的方式去注册服务,下面用ExposedServiceAttribute去注册Prism里面的功能

 [ExposedServiceAttribute(Lifetime.Singleton, AutoInitialize = true)]
    public sealed class PrismProvider
    {

        public PrismProvider(
            IContainerExtension container,
            IRegionManager regionManager,
            IDialogService dialogService,
            IEventAggregator eventAggregator,
            IModuleManager moduleManager)
        {
            LanguageManager = language;
            Container = container;
            RegionManager = regionManager;
            DialogService = dialogService;
            EventAggregator = eventAggregator;
            ModuleManager = moduleManager;
        }


        /// <summary>
        /// 容器
        /// </summary>
        public static IContainerExtension Container { get; private set; }

        /// <summary>
        /// 区域管理器接口
        /// </summary>
        public static IRegionManager RegionManager { get; private set; }

        /// <summary>
        /// 对话框管理器
        /// </summary>
        public static IDialogService DialogService { get; private set; }

        /// <summary>
        /// 事件聚合器
        /// </summary>
        public static IEventAggregator EventAggregator { get; private set; }

        /// <summary>
        /// 模块管理器
        /// </summary>
        public static IModuleManager ModuleManager { get; private set; }

    }

使用:

            //第一步,加载模块
            PrismProvider.ModuleManager.LoadModule(ModuleName.LoginModuleProfile);
            //第二步,导航区域
            PrismProvider.RegionManager.RequestNavigate(ContentControlName.MainWindowReginName, ViewNames.LoginView);

 

标签:container,ModuleAttribute,type,Prism,static,模块,var,IOC,public
From: https://www.cnblogs.com/MingQiu/p/18005564

相关文章

  • 1.Prism框架介绍
    什么是Prism:1.WPFPrism是一个用于构建模块化、可扩展和可重用的WPF应用程序的框架。它基于MVVM模式,提供了一种简单且灵活的方式来管理复杂的WPF应用程序。2.Prism框架提供了一些核心概念,包括模块化开发、依赖注入、命令模式、导航和事件聚合等。它还提供了一些实用工具和类来简......
  • WPF Prism,mvvm模式下,DataGrid中一列CheckBox的勾选的绑定
    背景WPF+Prism,View和ViewModel,通过Binding来实现数据的更新和界面的刷新,我的需求是做一个表格,第一列为CheckBox,同时这一列的header也是CheckBox,勾选了header的CheckBox,可以实现所有行的CheckBox全选的功能界面如下:实现方法xaml代码:<DataGridx:Name="dgRoundRobin"......
  • Prism:打造WPF项目的MVVM之选,简化开发流程、提高可维护性
     概述:探索WPF开发新境界,借助PrismMVVM库,实现模块化、可维护的项目。强大的命令系统、松耦合通信、内置导航,让您的开发更高效、更流畅在WPF开发中,一个优秀的MVVM库是Prism。以下是Prism的优点以及基本应用示例:优点:模块化设计: Prism支持模块化开发,使项目更易维护和扩展。......
  • spring IOC DI 容器杂谈
    IOC容器的原理spring 博客收藏参考博客https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247484247&idx=1&sn=e228e29e344559e469ac3ecfa9715217&chksm=ebd74256dca0cb40059f3f627fc9450f916c1e1b39ba741842d91774f5bb7f518063e5acf5a0#rdhttps://www.zhihu.c......
  • Prism框架
    1.搭建(1)通过NuGet安装程序包Prism.DryIoc。(2)在App.xaml中引用Prism命名空间,项目应用对象改为PrismApplication,并且删除StartupUri。<prism:PrismApplicationx:Class="WpfApp1.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"......
  • 死磕Spring之IoC篇 - BeanDefinition 的解析过程(面向注解)
    BeanDefinition的解析过程(面向注解)前面的几篇文章对Spring解析XML文件生成BeanDefinition并注册的过程进行了较为详细的分析,这种定义Bean的方式是面向资源(XML)的方式。面向注解定义Bean的方式Spring的处理过程又是如何进行的?本文将会分析Spring是如何将 @Component......
  • 死磕Spring之IoC篇 - 解析自定义标签(XML 文件)
    解析自定义标签(XML文件)上一篇《BeanDefinition的解析阶段(XML文件)》文章分析了Spring处理 org.w3c.dom.Document 对象(XMLDocument)的过程,会解析里面的元素。默认命名空间(为空或者 http://www.springframework.org/schema/beans)的元素,例如 <bean/> 标签会被解析成Generic......
  • Spring IOC 容器加载过程详解
    在Spring框架中,IOC(InversionofControl)容器是核心的概念之一。IOC容器负责管理和装配各个组件,本文将详细介绍SpringIOC容器的加载过程,包括如何配置、初始化和装配Bean。1.什么是IOC容器IOC容器是Spring框架的一个关键组件,负责管理Java对象的生命周期、配置信息以及对象之间的......
  • VisualStudioCode 代码对齐
    VisualStudioCode(简称VSCode)提供了多种方法来实现代码的对齐:1.内置对齐功能:通过快捷键`Shift+Alt+F`可以对当前选中文本进行对齐。这个方法适合于对单个区域进行快速对齐的情况。2.安装插件以实现自动对齐:VSCode有多个插件支持自动对齐功能,例如"Beautify"......
  • Spring IoC 原理剖析
    目录IoC容器系列的设计与实现:BeanFactory和ApplicationContextIOC容器接口设计图BeanFactory容器设计原理编程式使用IOC容器ApplicationContext设计原理AbstractRefreshableApplicationContextIoC容器的初始化创建Bean容器前的准备工作创建Bean容器,加载并注册Bean刷新Bean......