在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. HBase-宽表和高表的对比

    一.宽表和高表定义 HBase 中的表可以设计为高表(tall-narrow table) 和 宽表(flat-wide table): (1) 宽表是指很多列较少行,即列多行少的表,一行中的数据量较 ...

  2. Java基础综合测试

    Java版基础练习题: 输入练习: [问题描述] 任务很简单: 给定若干个整数,请编程输出它们的和. [输入形式] 输入包含多组测试用例. 每组测试数据首先是一个正整数N,表示本组数据有N个整数. 请 ...

  3. 使用lvs实现ftp的负载均衡

    操作系统:CentOS6.5_x64 问题描述 使用lvs实现ftp的负载均衡 为了使模型足够简单,这里只实现了loadblance,HA并未实现,可以借助keepalived实现. 具体实现 hos ...

  4. NC19989 [HAOI2012]容易题(EASY)

    题目链接 题目 题目描述 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下: 有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于一些A[i]不能 ...

  5. STM32F401的外部中断EXTI

    stm32f401 EXTI EXTI就是External interrupt/event controller, 外部事件和中断控制器, 包含21条边沿检测线. 每条线可以独立设置触发事件(上升沿, ...

  6. 通过performance_schema获取造成死锁的事务语句(转)

    数据库日常维护中我们经常遇到死锁的问题,由于无法获取造成死锁的事务内执行过的语句,对我们死锁的分析造成很大的困难.但是在MySQL 5.7中我们可以利用performance_schema来获取这些语 ...

  7. Java设计模式-组合模式Composite

    介绍 组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示"整体-部分"的层次关系. 组合模式依据树形结构来组合对 ...

  8. MinGW 和 MSVC

    在 Winodws 上编译通常会用到这两种工具链 MinGW(Minimalist GNU for Windows) 通常用于跨平台开发,可以编译出在 Windows 系统上运行的 .exe 程序 M ...

  9. C++ 多线程的错误和如何避免(15)

    尽量不使用无锁架构,除非绝对必要 复杂性中有一些东西吸引了每一位工程师.与常规同步机制(如互斥锁.条件变量.异步等)相比,无锁编程听起来非常性感.然而,与我交谈过的每一位经验丰富的 C++ 开发人员都 ...

  10. ubuntu18.04下安装MySQL5.7

    更新源 sudo apt update 安装mysql sudo apt install mysql-server 使用sudo mysql进入数据设置root账户的密码和权限 sudo mysql ...