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

相关文章
|
4月前
|
Linux Android开发 iOS开发
开源的Python库,用于开发多点触控应用程序
Kivy是一款开源Python库,专为开发多点触控应用设计,支持Android、iOS、Linux、OS X和Windows等平台。本文将指导你使用Kivy创建“Hello World”应用并打包成Android APK。首先通过`pip install kivy`安装Kivy,然后创建并运行一个简单的Python脚本。接着,安装Buildozer并通过`buildozer init`生成配置文件,修改相关设置后,运行`buildozer -v android debug`命令打包应用。完成构建后,你将在`./bin/`目录下找到类似`your-app-debug.apk`的文件。
95 2
|
5月前
|
前端开发 开发者 C#
深度解析 Uno Platform 中的 MVVM 模式:从理论到实践的全方位指南,助你轻松掌握通过 C# 与 XAML 构建高效可维护的跨平台应用秘籍
【8月更文挑战第31天】本文详细介绍如何在优秀的跨平台 UI 框架 Uno Platform 中实施 MVVM(Model-View-ViewModel)模式,通过一个简单的待办事项列表应用演示其实现过程。MVVM 模式有助于分离视图层与业务逻辑层,提升代码组织性、易测性和可维护性。Uno Platform 的数据绑定机制使视图与模型间的同步变得高效简便。文章通过构造 `TodoListViewModel` 类及其相关视图,展示了如何解耦视图与模型,实现动态数据绑定及命令处理,从而提高代码质量和开发效率。通过这一模式,开发者能更轻松地构建复杂的跨平台应用。
65 0
|
5月前
|
C# Windows 开发者
超越选择焦虑:深入解析WinForms、WPF与UWP——谁才是打造顶级.NET桌面应用的终极利器?从开发效率到视觉享受,全面解读三大框架优劣,助你精准匹配项目需求,构建完美桌面应用生态系统
【8月更文挑战第31天】.NET框架为开发者提供了多种桌面应用开发选项,包括WinForms、WPF和UWP。WinForms简单易用,适合快速开发基本应用;WPF提供强大的UI设计工具和丰富的视觉体验,支持XAML,易于实现复杂布局;UWP专为Windows 10设计,支持多设备,充分利用现代硬件特性。本文通过示例代码详细介绍这三种框架的特点,帮助读者根据项目需求做出明智选择。以下是各框架的简单示例代码,便于理解其基本用法。
250 0
|
5月前
|
C# 开发者 测试技术
震惊!Xamarin 竟能如此构建跨平台应用程序,代码共享、界面设计与性能优化全攻略大揭秘!
【8月更文挑战第31天】在移动应用开发领域,跨平台工具日益受到青睐。Xamarin 是一款强大的工具,支持使用 C# 开发适用于 iOS、Android 和 Windows 的应用。通过安装 Visual Studio 或 Visual Studio for Mac,并创建 Xamarin 项目,开发者可以利用丰富的功能和工具进行开发。Xamarin 的主要优势在于代码共享,能够显著提高开发效率。
102 0
|
数据采集 存储 设计模式
嵌入式软件应用程序开发框架浅见
嵌入式Linux系统上开发,其实和PC上的软件开发很类似,一个好的框架,能保证系统的稳定性,同时也能降低开发难度。
245 0
|
存储 内存技术
[UWP] 用 AudioGraph 来增强 UWP 的音频处理能力——AudioFrameInputNode
原文:[UWP] 用 AudioGraph 来增强 UWP 的音频处理能力——AudioFrameInputNode 上一篇心得记录中提到了 AudioGraph, 描述了一下 什么是 AudioGraph 以及其中涉及到的各种类型的 节点(Node)。
1506 0
|
C# 开发者 容器
MEF 插件式开发 - 小试牛刀
原文:MEF 插件式开发 - 小试牛刀 目录 MEF 简介 实践出真知 面向接口编程 控制反转(IOC) 构建入门级 MEF 相关参考 MEF 简介 Managed Extensibility Framework 即 MEF 是用于创建轻量、可扩展应用程序的库。
915 0

热门文章

最新文章