即插即用插件式框架的程序集处理遐想(TypeFinder)

简介:

摘要:

    在多层架构中我们经常都会通过工厂模式来对数据库层的类进行初始化,有些会用抽象类作为基类,有些会用接口然后通过反射来对其进行初始化。而把需要初始化的类型和程序集通过字符串保存在配置文件中或数据库中等等,今天我将要介绍的是不需要保存配置文件而去BIN目录寻找你所要的抽象类或接口的子类并将其初始化后返回。这种方法可以用在其他方面,当然这会对应用程序的性能造成影响,所以我们应该适当的应用他。

检索程序集:

     每一个写程序的人都知道,程序就是像建房子,首先要先规划设计然后一块砖一块砖的从地基开始建起。我们要知道在BIN目录中检索类,首先需要知道的是我们如何从一个程序集中检索我们所需要的类型。我们先看如下代码:

 1  private   void  SearchTypes(Assembly asm, ArrayList types, Type type)
 2          {
 3              ArrayList list  =   new  ArrayList();
 4               if  (type.IsInterface)
 5              {
 6                   foreach  (Type it  in  asm.GetTypes())
 7                  {
 8                       if  (it.IsPublic  &&  (it.GetInterface(type.FullName)  !=   null ))
 9                      {
10                          list.Add(it);
11                      }
12                  }
13              }
14               else
15              {
16                   foreach  (Type ct  in  asm.GetTypes())
17                  {
18                       if  (ct.IsPublic  &&  ct.IsSubclassOf(type))
19                      {
20                          list.Add(ct);
21                      }
22                  }
23              }
24               foreach  (Type t  in  list)
25              {
26                   try
27                  {
28                       object  obj  =  asm.CreateInstance(t.FullName);
29                      types.Add(obj);
30                  }
31                   catch {
32                  }
33              }
34          }
35 

代码说明:

    asm:当前要检索的程序集,我们可以通过asm.GetTypes()来获取当前程序集中所有类型,然后在循环匹配通过判断是否类当前类型(type)的子类而将其保存在ArrayList中。由于可能会涉及到好几个类型,而又不是强类型我们用ArrayList来保存初始化后的对象(types),代码很简单基本上能够看的懂,这里就不多说了。
 

BIN目录检索:

    我们知道了在程序集中如何检索类并初始化那在BIN目录中检索程序集那就更简单了,没什么好说的了看代码:

 1  public  ArrayList FindType(Type type)
 2          {
 3               string  path;
 4              ArrayList types  =   new  ArrayList();
 5              HttpContext current  =  HttpContext.Current;
 6               if  (current  !=   null )
 7              {
 8                  path  =  current.Server.MapPath( "~/bin" );
 9              }
10               else
11              {
12                  path  =  AppDomain.CurrentDomain.BaseDirectory;
13              }
14               string [] fileSystemEntries  =  Directory.GetFileSystemEntries(path,  "*.dll" );
15               for  ( int  i  =   0 ; i  <  fileSystemEntries.Length; i ++ )
16              {
17                   try
18                  {
19                      Assembly asm  =  Assembly.LoadFrom(fileSystemEntries[i]);
20                       this .SearchTypes(asm, types, type);
21                  }
22                   catch
23                  {
24                  }
25              }
26               return  types;
27          }
28 

总结:

    以上是在BIN目录中检索,如果BIN不存在就在当前基目录中检索,我们可以设置一个属性来保存这个目录而不一定目录这样我们就可以在其它目录中取得我们所要的对象。检索各个程序集肯定会损失不少性能,我们可以指定程序集因为往往我们的程序集都是有规则的,因为对我来说一般都是数据层中用到这个东东。初始化一个对象不容易啊,我们在初始化后何不把它缓存起来呢这样就可以提高一定的性能了。其实大多数我们在配置文件XML中配置就可以了,而不要用到这些,最后还是希望能够给大家带了点什么!

本文转自网魂小兵博客园博客,原文链接:http://www.cnblogs.com/xdotnet/archive/2007/05/09/get_types_from_bin_dictionary.html,如需转载请自行联系原作者

相关文章
|
3月前
|
IDE API 开发工具
鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之AlphabetIndexer组件
鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之AlphabetIndexer组件
49 1
|
3月前
|
IDE API 开发工具
 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Web组件
 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Web组件
47 2
|
移动开发 JavaScript 前端开发
开源项目推荐:SCADA组态软件Qt,kanzi,C#,MFC和WEB大全(收藏版)
开源项目推荐:SCADA组态软件Qt,kanzi,C#,MFC和WEB大全(收藏版)
3871 0
|
3月前
|
IDE 开发工具 开发者
鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之NavRouter组件
鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之NavRouter组件
52 3
|
数据采集 存储 设计模式
嵌入式软件应用程序开发框架浅见
嵌入式Linux系统上开发,其实和PC上的软件开发很类似,一个好的框架,能保证系统的稳定性,同时也能降低开发难度。
190 0
|
开发框架 JSON 前端开发
浅入ABP(2):添加基础集成服务
浅入ABP(2):添加基础集成服务
556 0
浅入ABP(2):添加基础集成服务
|
存储 机器人 API
网络游戏简单化!PUN插件了解一下?(Unity3D)
Photon Unity Networking (PUN)是一种用于多人游戏的Unity软件包。 灵活的匹配可以让玩家进入房间,可以通过网络同步对象。 快速和可靠的通信是通过专用的Photon 服务器完成的,因此客户端连接不需要1对1。
|
Web App开发 前端开发 .NET
【ABP框架系列学习】模块系统(4)
原文:【ABP框架系列学习】模块系统(4) 0.引言 ABP提供了构建模块和通过组合模块以创建应用程序的基础设施。一个模块可以依赖于另外一个模块。通常,程序集可以认为是模块。如果创建多个程序集的应用程序,建议为每个程序集创建模块定义。
1540 0
|
存储 传感器 API
C#使用Xamarin开发可移植移动应用终章(11.获取设备信息与常用组件,开源一个可开发模版.)
原文:C#使用Xamarin开发可移植移动应用终章(11.获取设备信息与常用组件,开源一个可开发模版.) 前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.
1546 0