首页 > 其他分享 >Prism通过反射机制自动注册对话视图模型

Prism通过反射机制自动注册对话视图模型

时间:2022-11-15 22:56:37浏览次数:46  
标签:反射 string viewName 视图 Prism IContainerRegistry viewType public

摘要说明

在使用WPF+Prism开发中,有时会需要使用到一些弹窗服务,而在Prism当中,我们使用Dialog是需要注入到IOC容器当中的,传统的写法如下:

image-20221115222944124

而当Dialog过多时或者需要新增一个弹窗时,每次都需要写一行这个注册,属实有点麻烦,所以我查阅了一下Prism源码,写了一个自动注册的扩展方法。

扩展IContainerRegistry通过类型注入对话服务

public static class IContainerRegistryDialogExtensions
    {
        public static void RegistryDialogByType(this IContainerRegistry registry, Type viewType, Type viewModelType, string viewName = null)
        {
            if (string.IsNullOrWhiteSpace(viewName))
                viewName = viewType.Name;

            ViewModelLocationProvider.Register(viewType.ToString(), viewModelType);
            registry.RegisterForNavigation(viewType, viewName);
        }

        public static void RegistryDialogByType(this IContainerRegistry registry, Type viewType, string viewName = null)
        {
            if (string.IsNullOrWhiteSpace(viewName))
                viewName = viewType.Name;
            registry.RegisterForNavigation(viewType, viewName);
        }
    }

编写自动注入的特性

public class DialogConfigureAttribute : System.Attribute
    {
        public Type View { get; set; }

        public string ViewName { get; set; }

        public DialogConfigureAttribute(Type viewType, string viewName = null)
        {
            this.View = viewType;
            this.ViewName = viewName;
        }
    }

该特性可以根据项目实际情况来定,其中视图类型视图名称是必须的

编写自动注入方法

public void RegisterTypes(IContainerRegistry containerRegistry)
        {
            ....
            //调用自动注入方法
            DialogConfigure(containerRegistry);
        }

        /// <summary>
        /// 注册有Model的对话服务
        /// </summary>
        /// <param name="containerRegistry"></param>
        private void DialogConfigure(IContainerRegistry containerRegistry)
        {
            var allType = Assembly.GetCallingAssembly().GetExportedTypes().Where(t => t.IsDefined(typeof(DialogConfigureAttribute)));
            foreach (var item in allType)
            {
                var dialogConfigure = item.GetCustomAttribute(typeof(DialogConfigureAttribute)) as DialogConfigureAttribute;
                containerRegistry.RegistryDialogByType(dialogConfigure.View, item, dialogConfigure.ViewName);
            }
        }

使用特性

后续在所有Dialog的视图模型中即可使用我们定义好的特性

image-20221115223737775

程序在App.xaml.cs中初始化中就会通过反射自动找出含有该特性的类,并为我们注入到IOC中

写在最后

依据上面例子,还有很多场景可以利用反射+特性的形式为我们解决相关重复性劳动力的问题,思维打开,学会举一反三,例如我们还可以设计出自动生成菜单目录的方法,如果有需要,后续我再继续更新。

标签:反射,string,viewName,视图,Prism,IContainerRegistry,viewType,public
From: https://www.cnblogs.com/chonglu/p/16894338.html

相关文章

  • MySQL视图
    准备工作,新建名为students的数据,三张表分别是student,courses,stu_cou,并创建外键约束,级联删除更新,插入数据。/*创建数据库*/createdatabaseifnotEXISTSstudentscha......
  • 视图层 View
    框架的视图层由WXML与WXSS编写,由组件来进行展示。将逻辑层的数据反映成视图,同时将视图层的事件发送给逻辑层。WXML(WeiXinMarkuplanguage)用于描述页面的结构。W......
  • 67.数据变了视图没变,怎么查找错误,怎么解决
    console.log()打印数据,看一下数据是否改变,切换到vue.js.develops插件修改数据,看一下视图是否有变化;如果没有变化,可能是vue的视图没有监听的数据的改变,数据可能不是响......
  • 面向对象--反射
    --反射可以用过字符串的形式来操作(增删改查)一个对象的属性有几种方法getattr()获取hasattr()判断setattr()赋值delattr()删除 classPerson(o......
  • Java中通过反射+自定义注解判断对象中部分属性是否为空,返回为空字段的名称或自定义含
    场景若依管理系统前后端分离版基于ElementUI和SpringBoot怎样实现Excel导入和导出:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108278834在上面进行exc......
  • Java中通过反射获取自定义注解中标识的对象属性信息(若依@Excel注解示例)
    场景若依管理系统前后端分离版基于ElementUI和SpringBoot怎样实现Excel导入和导出:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108278834在上面进行exc......
  • 巨蟒python全栈开发django3:url&&视图
    1.url正则匹配分组和命名分组2.路由分发3.url别名和反向解析4.httprequest和httpresponse的使用 内容回顾:1.jinja2(flask框架,没有内置模板对象,需要自己用jinja2)......
  • 第1章SpringMVC*概述-注册中央调度区,定义页面,修改视图解析器
    第1章SpringMVC概述1.1SpringMVC简介SpringMVC也叫Springwebmvc。是Spring框架的一部分,是在Spring3.0后发布的。1.2SpringMVC优点1.基于MVC架构......
  • Oracle 19C学习 - 21. 物化视图
    什么是物化视图Oracle物化视图是包括一个查询结果的数据库对象。它是一种非本地数据的本地化副本,或用来生成基于某种功能或者业务需求的汇总表。物化视图存储基于非本地......
  • 反射
    反射获得反射对象Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期间借助于ReflectionAPI取得任何类的内部信息,并能直接操作任意对象的内部属性及......