在多层架构中我们经常都会通过工厂模式来对数据库层的类进行初始化,有些会用抽象类作为基类,有些会用接口然后通过反射来对其进行初始化。而把需要初始化的类型和程序集通过字符串保存在配置文件中或数据库中等等,今天我将要介绍的是不需要保存配置文件而去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中配置就可以了,而不要用到这些,最后还是希望能够给大家带了点什么!