WPF多数类概念性注册加自动扫描
在java中springboot的配置应用了自动扫描
@ComponentScan(value = {"com.example", "com.fox"})
而对于Asp.Net Core 可以使用Scrutor
static void Main(string[] args)
{
var collection = new ServiceCollection();
collection.Scan(action =>
action.FromAssemblyOf<IScanAssemblyMarker>()
.AddClasses(@class => @class.Where(t => t.Name.EndsWith("Service")))
.UsingRegistrationStrategy(RegistrationStrategy.Throw)
.AsMatchingInterface()
.WithScopedLifetime()
.AddClasses(@class => @class.Where(t => t.Name.EndsWith("Repository")))
.UsingRegistrationStrategy(RegistrationStrategy.Throw)
.AsMatchingInterface()
.WithSingletonLifetime());
foreach (var item in collection)
{
var log = $"Service: {item.ServiceType.FullName} Lifetime: {item.Lifetime}\nInstance: {item.ImplementationType?.FullName}\n";
Console.WriteLine(log);
}
}
唯独WPF没有,悲催,所以他时常是这样的
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterScoped<IHeaderItemRepository, HeaderItemRepository>();
containerRegistry.RegisterScoped<IHeaderService, HeaderItemService>();
containerRegistry.RegisterForNavigation<GeneratorView, GeneratorViewModel>();
}
我这个都算写的少了,多的可长达20行也是可以的,虽然Prism内置了Module,可以模块化分布写
但是我们可以自己实现一个扫描器
只需要用到反射
众所周知,看代码
public static void GetParentInfo()
{
Type type = typeof(SubClasses);
Type baseType = type.BaseType;
Console.WriteLine("父类"+baseType.Name); //获取父类
Type[] interfaces= type.GetInterfaces();
foreach (Type iface in interfaces)
{
Console.WriteLine("父类接口"+iface.Name); //获取所有父类接口
}
}
public static void GetSubClassesInfo()
{
var typesImplementingC = Assembly.GetExecutingAssembly().GetTypes()
.Where(t => typeof(IParent).IsAssignableFrom(t) && !t.IsInterface);
foreach (var type in typesImplementingC)
{
Console.WriteLine("子类: " + type.Name);
Console.WriteLine("平类:"+type.BaseType.Name);
}
}
我这里提供两点思路,1、扫描程序集,2、自定义接口去注册
public interface IPrismComponent
{
}
public void Register()
{
var assembly = Assembly.GetExecutingAssembly(); // 获取当前执行的程序集
var types = assembly.GetTypes()
.Where(myType => myType.IsClass && !myType.IsAbstract && typeof(IPrismComponent).IsAssignableFrom(myType)); // 找到所有实现了IPrismComponent的非抽象类
foreach (var type in types)
{
containerRegistry.RegisterScoped(typeof(IPrismComponent), type); // 将找到的类型注册为IPrismComponent的实现
}
}
唯一有缺陷的地方就是Prism中对于注册仓储,注册服务,注册导航,用到的方法不一样,我暂时还没有想到好的办法,
唯一的想法就是这个类是Repository结尾,是Service结尾还是ViewModel结尾,然后给这些类都标注特性
[Register]
public class MainViewModel{}
[Register]
public class MainService{}
[Register]
public class MainRepository{}
不过这样一来就和Prism对View和ViewModel的注册思想是一样的,我也是吸取了它的思想,约定大于配置
接下来我们对不同结尾的类进行分布处理
使用特性,让这些类在实例化之前以不同的方式注册,
不管是单例注册,瞬时注册,作用域注册,UI导航注册
我们使用AOP去处理,
这样就不用写一长串的
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
}
而又因为最新的WPF是可以内置js的,所以会前端的福利来了
不会的也没关系
在Asp.Net Core中是程序启动自动扫描appsetting.json的
WPF没有这个功能,除非使用WPF使用Furion框架,它里面内置了这个功能,
通常情况下,我们的json文件是这样的
{
"SqlConnection": {
"ConnectionMMsql": "server=.;uid=sa;pwd=xxx;database=xxx;Trusted_Connection=true;",
"ConnectionMysql":
"database = xxx; server = localhost; port = 3306; uid = xxx; pwd = xxx; "
}
}
我们可以在这里配置,然后序列化对象,这样省去了写代码
这应该是最好的应用方式,我们在这里配置
"scaning":"true,xxx"
达到扫描某个程序集,并给true
只需要在程序启动打开这个json的序列化就行了
WPF多数类概念性注册加自动扫描的更多相关文章
- Yaf零基础学习总结5-Yaf类的自动加载
Yaf零基础学习总结5-Yaf类的自动加载 框架的一个重要功能就是类的自动加载了,在第一个demo的时候我们就约定自己的项目的目录结构,框架就基于这个目录结构来自动加载需要的类文件. Yaf在自启动的 ...
- thinkphp系列:类的自动加载是如何设计的
在使用框架开发时,可以发现框架有很多核心类,却很少看到显示的引入某个文件的代码,这是因为框架都采用了类的自动加载机制,即使用到类时,框架会自动找到该类所在文件的位置并引入该文件.为了更容易看出代码思路 ...
- final关键字,类的自动加载,命名空间
final关键字 1.final可以修饰方法和类,但是不能修饰属性: 2.Final修饰的类不能被继承: 3.Fina修饰的方法不能被重写,子类可以对已被final修饰的父类进行访问,但是不能对父类的 ...
- PHP面向对象学习-属性 类常量 类的自动加载 构造函数和析构函数 访问控制(可见性)
在类的成员方法里面,可以用 ->(对象运算符):$this->property(其中 property 是该属性名)这种方式来访问非静态属性.静态属性则是用 ::(双冒号):self::$ ...
- 浅析PHP类的自动加载和命名空间
php是使用require(require_once)和include(include_once)关键字加载类文件.但是在实际的开发工程中我们基本上不会去使用这些关键字去加载类. 因为这样做会使得代码 ...
- JAVA类的静态加载和动态加载以及NoClassDefFoundError和ClassNotFoundException
我们都知道Java初始化一个类的时候可以用new 操作符来初始化, 也可通过Class.forName()的方式来得到一个Class类型的实例,然后通过这个Class类型的实例的newInstance ...
- java动态编译类文件并加载到内存中
如果你想在动态编译并加载了class后,能够用hibernate的数据访问接口以面向对象的方式来操作该class类,请参考这篇博文-http://www.cnblogs.com/anai/p/4270 ...
- java动态加载类和静态加载类笔记
JAVA中的静态加载类是编译时刻加载类 动态加载类指的是运行时刻加载类 二者有什么区别呢 举一个例子 现在我创建了一个类 实现的功能假设为通过传入的参数调用具体的类和方法 class offic ...
- Java_类文件及加载机制
类文件及类加载机制 标签(空格分隔): Java 本篇博客的重点是分析JVM是如何进行类的加载的,但同时我们会捎带着说一下Class类文件结构,以便对类加载机制有更深的理解. 类文件结构 平台无关性 ...
- 保存项目文件“XXX.csprj”时出错。类没有注册。
[出错提示]保存项目文件“XXX”时出错.类没有注册.正在查找具有CLSID的对象:{D9B3211D-E57F-4426-AAEF-30A806ADD397}. [解决办法] 需要安装:MSXML_ ...
随机推荐
- [Ngbatis源码学习][Spring] Spring 的资源管理 ResourceLoader
在学习Ngbatis的源码时,看到了有关xml文件的加载,涉及到了资源的加载,对相关知识进行总结与整理. 1. 相关类 Resource AbstractResource ResourceLoader ...
- vuecli 自动转换小文件为 base64 格式,如何关闭?
1. 问题 最近在写 vue 项目时,发现稍微小一点的静态资源,例如字体文件, 图片都被自动转换为 base64 格式了. 在网上搜索时基本都是去配置 url-loader ,配置后提示:Can't ...
- Centos7安装php7.4
添加 EPEL and REMI 仓库 yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarc ...
- Java中交换2个变量的三种方式
这一题是我之前找Java工作时的笔试题,比较有代表性,拿出来和大家分享. package com.dylan.practice.interview; /** * 交换2个整形变量的几种方式 * * @ ...
- 开源开发者的狂欢,STRK开了一个好头!附领取价值800元的web3空投教程
这两天在Github和推特上最热闹的事情便是知名ETH(以太坊)二层公链项目STRK给所有gtihub上排名前5000的开源项目的项目贡献者提供了价值800元的代币空投,其中不乏前端程序员.大学生等w ...
- win32-ReadProcessMemory在x86和x64下运行
#include <iostream> #include <Windows.h> #include <winternl.h> #include <tchar. ...
- 2024-02-24:用go语言,给你一个 n 个点的带权无向连通图,节点编号为 0 到 n-1, 同时还有一个数组 edges ,其中 edges[i] = [fromi, toi, weighti
2024-02-24:用go语言,给你一个 n 个点的带权无向连通图,节点编号为 0 到 n-1, 同时还有一个数组 edges ,其中 edges[i] = [fromi, toi, weighti ...
- 【Android逆向】frida hook so 函数
1. apk来自52pojie 链接:https://pan.baidu.com/s/1vKC1SevvHfeI7f0d2c6IqQ 密码:u1an 2.apktool反编译apk,拿到so文件 ja ...
- 学会了Java 8 Lambda表达式,简单而实用
OneAPM 摘要:此篇文章主要介绍Java8 Lambda 表达式产生的背景和用法,以及 Lambda 表达式与匿名类的不同等.本文系OneAPM工程师编译整理. Java是一流的面向对象语言,除了 ...
- 钉钉机器人自动关联 GitHub 发送 approval prs
摘要:用技术来解决 PM 枯燥的 approval pr 工作,本文将阐述如何自动化获取 GitHub Organization 下各个 repo 待 merge 的 pull requests 并通 ...