即插即用插件式框架的程序集处理遐想(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,如需转载请自行联系原作者

相关文章
|
6月前
|
机器学习/深度学习 人工智能 测试技术
11种开源即插即用模块汇总 !!(附论文和代码)
11种开源即插即用模块汇总 !!(附论文和代码)
379 1
|
3月前
|
C# 开发者 测试技术
震惊!Xamarin 竟能如此构建跨平台应用程序,代码共享、界面设计与性能优化全攻略大揭秘!
【8月更文挑战第31天】在移动应用开发领域,跨平台工具日益受到青睐。Xamarin 是一款强大的工具,支持使用 C# 开发适用于 iOS、Android 和 Windows 的应用。通过安装 Visual Studio 或 Visual Studio for Mac,并创建 Xamarin 项目,开发者可以利用丰富的功能和工具进行开发。Xamarin 的主要优势在于代码共享,能够显著提高开发效率。
73 0
|
4月前
|
iOS开发 开发者 UED
探索iOS开发中的SwiftUI框架:构建现代应用程序的桥梁
本文深入探讨了SwiftUI框架在iOS开发中的应用,揭示了其对提升开发效率和改善用户体验的重要性。通过分析SwiftUI的设计哲学、核心组件以及与旧有开发模式的比较,文章旨在为读者提供关于如何利用SwiftUI构建现代化应用程序的实用指南。
|
存储 传感器 API
C#使用Xamarin开发可移植移动应用终章(11.获取设备信息与常用组件,开源一个可开发模版.)
原文:C#使用Xamarin开发可移植移动应用终章(11.获取设备信息与常用组件,开源一个可开发模版.) 前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.
1700 0
|
C# 开发者 容器
MEF 插件式开发 - 小试牛刀
原文:MEF 插件式开发 - 小试牛刀 目录 MEF 简介 实践出真知 面向接口编程 控制反转(IOC) 构建入门级 MEF 相关参考 MEF 简介 Managed Extensibility Framework 即 MEF 是用于创建轻量、可扩展应用程序的库。
907 0