在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多数类概念性注册加自动扫描的更多相关文章

  1. Yaf零基础学习总结5-Yaf类的自动加载

    Yaf零基础学习总结5-Yaf类的自动加载 框架的一个重要功能就是类的自动加载了,在第一个demo的时候我们就约定自己的项目的目录结构,框架就基于这个目录结构来自动加载需要的类文件. Yaf在自启动的 ...

  2. thinkphp系列:类的自动加载是如何设计的

    在使用框架开发时,可以发现框架有很多核心类,却很少看到显示的引入某个文件的代码,这是因为框架都采用了类的自动加载机制,即使用到类时,框架会自动找到该类所在文件的位置并引入该文件.为了更容易看出代码思路 ...

  3. final关键字,类的自动加载,命名空间

    final关键字 1.final可以修饰方法和类,但是不能修饰属性: 2.Final修饰的类不能被继承: 3.Fina修饰的方法不能被重写,子类可以对已被final修饰的父类进行访问,但是不能对父类的 ...

  4. PHP面向对象学习-属性 类常量 类的自动加载 构造函数和析构函数 访问控制(可见性)

    在类的成员方法里面,可以用 ->(对象运算符):$this->property(其中 property 是该属性名)这种方式来访问非静态属性.静态属性则是用 ::(双冒号):self::$ ...

  5. 浅析PHP类的自动加载和命名空间

    php是使用require(require_once)和include(include_once)关键字加载类文件.但是在实际的开发工程中我们基本上不会去使用这些关键字去加载类. 因为这样做会使得代码 ...

  6. JAVA类的静态加载和动态加载以及NoClassDefFoundError和ClassNotFoundException

    我们都知道Java初始化一个类的时候可以用new 操作符来初始化, 也可通过Class.forName()的方式来得到一个Class类型的实例,然后通过这个Class类型的实例的newInstance ...

  7. java动态编译类文件并加载到内存中

    如果你想在动态编译并加载了class后,能够用hibernate的数据访问接口以面向对象的方式来操作该class类,请参考这篇博文-http://www.cnblogs.com/anai/p/4270 ...

  8. java动态加载类和静态加载类笔记

    JAVA中的静态加载类是编译时刻加载类  动态加载类指的是运行时刻加载类 二者有什么区别呢 举一个例子  现在我创建了一个类  实现的功能假设为通过传入的参数调用具体的类和方法 class offic ...

  9. Java_类文件及加载机制

    类文件及类加载机制 标签(空格分隔): Java 本篇博客的重点是分析JVM是如何进行类的加载的,但同时我们会捎带着说一下Class类文件结构,以便对类加载机制有更深的理解. 类文件结构 平台无关性 ...

  10. 保存项目文件“XXX.csprj”时出错。类没有注册。

    [出错提示]保存项目文件“XXX”时出错.类没有注册.正在查找具有CLSID的对象:{D9B3211D-E57F-4426-AAEF-30A806ADD397}. [解决办法] 需要安装:MSXML_ ...

随机推荐

  1. Linux-expect(以交互形式输入命令,实现交互通信)

    1.expect简介 expect是一种脚本语言,它能够代替人工实现与终端的交互,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信. 安装命令: yum install ex ...

  2. ABC 326

    E 题意: 给定一个 \(n\) 面骰,长度 \(n\) 的数组 \(a\) 和一个初始为 \(0\) 的变量 \(x\). 每次投掷骰子,等概率获得 \(1 \sim n\) 中的一个数 \(p\) ...

  3. 山东职业竞赛wp2023(arm、cpython)

    pwn2 return2libc,白给 from evilblade import * context(os='linux', arch='amd64') context(os='linux', ar ...

  4. NC18987 粉嘤花之恋

    题目链接 题目 题目描述 qn是个特别可爱的小哥哥,qy是个特别好的小姐姐,他们两个是一对好朋友 [ cp (划掉~) 又是一年嘤花烂漫时,小qn于是就邀请了qy去嘤花盛开的地方去玩.当qy和qn来到 ...

  5. NVME(学习笔记八)—Asymmetric Namespace Report

    8.20 非对称namespace访问报告 8.20.1 非对称namespace访问报告概况 非对称Namespace访问(ANA)在如下场景下产生,基于访问这个namespace的controll ...

  6. android架构组件Lifecycle

    Lifecycle 组件指的是 android.arch.lifecycle 包下提供的各种类与接口,可以让开发者构建能感知其他组件(主要指Activity .Fragment)生命周期(lifecy ...

  7. 【leetcode】合并 k 个有序链表,我给了面试官这 5 种解法

    开胃菜 在进入本节的正题之前,我们先来看一道开胃菜. 题目 21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1 ...

  8. 【OpenGL ES】光影(光照与阴影)效果

    1 前言 ​ Blinn改进的冯氏光照模型 中只展示了光照效果,本文将进一步展示阴影效果. ​ 绘制阴影,需要用到深度纹理,即从光源角度看模型并绘制一张纹理图,纹理图的颜色代表了模型上的点离光源的深度 ...

  9. Java中各种比较对象方式对比

    1.介绍 比较对象是面向对象编程语言的一个基本特征.在本教程中,我们将介绍Java语言的一些特性,这些特性允许我们比较对象.此外,我们还将研究外部库中的这些特性. 2.==和!=操作符 让我们从==和 ...

  10. 在矩池云使用Llama2-7B的方法

    今天给大家分享如何在矩池云服务器使用 Llama2-7b模型. 硬件要求 矩池云已经配置好了 Llama 2 Web UI 环境,显存需要大于 8G,可以选择 A4000.P100.3090 以及更高 ...