即插即用插件式框架的程序集处理

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

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


检索程序集:

每一个写程序的人都知道,程序就是像建房子,首先要先规划设计然后一块砖一块砖的从地基开始建起。我们要知道在BIN目录中检索类,首先需要知道的是我们如何从一个程序集中检索我们所需要的类型。我们先看如下代码:
复制   保存
private void SearchTypes(Assembly asm, ArrayList types, Type type)
{
ArrayList list = new ArrayList();
if (type.IsInterface)
{
foreach (Type it in asm.GetTypes())
{
if (it.IsPublic && (it.GetInterface(type.FullName) != null))
{
list.Add(it);
}
}
}
else
{
foreach (Type ct in asm.GetTypes())
{
if (ct.IsPublic && ct.IsSubclassOf(type))
{
list.Add(ct);
}
}
}
foreach (Type t in list)
{
try
{
object obj = asm.CreateInstance(t.FullName);
types.Add(obj);
}
catch
{
}
}
}


代码说明:

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


BIN目录检索:

我们知道了在程序集中如何检索类并初始化那在BIN目录中检索程序集那就更简单了,没什么好说的了看代码:
复制   保存
public ArrayList FindType(Type type)
{
string path;
ArrayList types = new ArrayList();
HttpContext current = HttpContext.Current;
if (current != null)
{
path = current.Server.MapPath("~/bin");
}
else
{
path = AppDomain.CurrentDomain.BaseDirectory;
}
string[] fileSystemEntries = Directory.GetFileSystemEntries(path, "*.dll");
for (int i = 0; i < fileSystemEntries.Length; i++)
{
try
{
Assembly asm = Assembly.LoadFrom(fileSystemEntries[i]);
this.SearchTypes(asm, types, type);
}
catch
{
}
}
return types;
}


总结:

以上是在BIN目录中检索,如果BIN不存在就在当前基目录中检索,我们可以设置一个属性来保存这个目录而不一定目录这样我们就可以在其它目录中取得我们所要的对象。检索各个程序集肯定会损失不少性能,我们可以指定程序集因为往往我们的程序集都是有规则的,因为对我来说一般都是数据层中用到这个东东。初始化一个对象不容易啊,我们在初始化后何不把它缓存起来呢这样就可以提高一定的性能了。其实大多数我们在配置文件XML中配置就可以了,而不要用到这些,最后还是希望能够给大家带了点什么!
目录
相关文章
|
存储 Java Linux
TeamTalk - 蘑菇街开源的一款企业办公即时通信软件
TeamTalk 是蘑菇街开源的一款企业办公即时通信软件,最初是为自己内部沟通而做的 IM 工具。团队自己的介绍如下: 2013年我们蘑菇街从社区导购华丽转身时尚电商平台,为解决千万妹子和时尚卖家的沟通问题,我们开发了自己的即时通讯软件。既然已经有了用户使用的IM,为什么我们自己公司内部沟通还要用第三方的呢?因此就有了TT(TeamTalk)的雏形,现在蘑菇街内部的在线沟通全部通过TT来完成。随着TT功能的逐渐完善,我们决定把TT开源来回馈开源社区,希望国内的中小企业都能用上开源、免费、好用的IM工具!
1285 0
TeamTalk - 蘑菇街开源的一款企业办公即时通信软件
|
12月前
|
供应链 区块链 数据安全/隐私保护
智能合约技术在供应链管理中的应用与挑战####
智能合约,作为区块链技术的重要组成部分,正逐步渗透至供应链管理领域,以其自动化执行协议、增强透明度与效率的特性,重塑着传统供应链的运作模式。本文旨在探讨智能合约如何在供应链中发挥作用,解决现有问题,并分析面临的挑战及可能的解决方案。通过具体案例分析,揭示其在提高供应链透明度、降低成本、加速交易速度等方面的潜力。 ####
|
并行计算 算法 量子技术
探索未来:量子计算在现代科技中的应用与挑战
随着科技的不断进步,量子计算作为一种新兴技术,其潜力和影响力日益凸显。本文将深入探讨量子计算的核心原理、当前技术发展现状以及面临的主要挑战。通过分析量子计算在特定领域的应用案例,本文旨在提供一个全面的视角,以理解量子计算如何塑造未来的科技格局。
|
Java 数据库
史上最全的 IDEA Debug 调试技巧(超详细案例)(二)
史上最全的 IDEA Debug 调试技巧(超详细案例)(二)
史上最全的 IDEA Debug 调试技巧(超详细案例)(二)
|
机器学习/深度学习 人工智能 编解码
安卓手机上跑15亿参数大模型,12秒不到就推理完了
安卓手机上跑15亿参数大模型,12秒不到就推理完了
430 0
|
小程序
阿里云软件著作权普通登记和加急有什么区别?
阿里云软件著作权登记普通等级价格便宜359/件,需要全程用户自助操作,阿里云仅通过初审,适合不着急并有软著申请经验的用户;加急登记有专属助手提供在线答疑,价格较贵1080元/件,审查周期是20-30工作日;顾问登记全程有阿里云专业顾问提供整理和填报材料服务,提高通过率,适合没有经验毕竟着急的用户,顾问登记是阿里云百科比较推荐的;安心登记价格最贵,相对于顾问登记支持补正不通过可退全款,用户完全没有风险
588 0
阿里云软件著作权普通登记和加急有什么区别?
|
机器学习/深度学习 编解码 人工智能
纯视觉3D目标检测新SOTA!STS:基于Camera的深度估计新方法
学习准确的深度对于多视图3D目标检测至关重要。最近的方法主要是从单目图像中学习深度,由于单目深度学习的不适定性,这些方法面临着固有的困难。在本项工作中,作者没有使用单一的单目深度方法,而是提出了一种新颖的环视temporal stereo(STS)技术,该技术利用跨时间帧之间的几何对应关系来促进准确的深度学习。
纯视觉3D目标检测新SOTA!STS:基于Camera的深度估计新方法
CRC校验
CRC--循环冗余校验
CRC校验
|
存储 消息中间件 分布式计算
Zookeeper详细使用解析!分布式架构中的协调服务框架最佳选型实践
本文主要介绍了Zookeeper实现分布式协调服务,解决分布式环境中服务的协调和管理问题。分析了Zookeeper实现分布式锁的方式,详细介绍Zookeeper中的数据模型和特点,Zookeeper中一致性的实现方式。通过使用Docker安装Zookeeper,说明了Zookeeper进行分布式协调服务时的三种工作模式以及三种使用的端口。
1193 0
Zookeeper详细使用解析!分布式架构中的协调服务框架最佳选型实践