// <summary> /// 抽象工厂模式创建DAL。 /// web.config 需要加入配置:(利用工厂模式+反射机制+缓存机制,实现动态创建不同的数据层对象接口) /// DataCache类在导出代码的文件夹里 /// 可以把所有DAL类的创建放在这个DataAccess类里 /// <appSettings> /// <add key="DAL" value="SmsSystem.SQLServerDAL" /> (这里的命名空间根据实际情况更改为自己项目的命名空间) /// </appSettings> /// </summary> public sealed class DataAccess { private static readonly string path = ConfigurationManager.AppSettings["DAL"]; /// <summary> /// 创建对象或从缓存获取 /// </summary> public static object CreateObject(string path, string CacheKey) { object objType = DataCache.GetCache(CacheKey);//从缓存读取 if (objType == null) { try { //Assembly ass = new Assembly(); objType = Assembly.Load(path).CreateInstance(CacheKey);//反射创建 DataCache.SetCache(CacheKey, objType);// 写入缓存 } catch(System.Exception ex) { string str = ex.Message;// SmsSystem.Utility.SaveLog.SaveInfoToLog(str, "errorLog", "异常"); } } return objType; } /// <summary> /// 不使用缓存,创建对象 /// </summary> private static object CreateObjectNoCache(string path, string CacheKey) { try { object objType = Assembly.Load(path).CreateInstance(CacheKey); return objType; } catch//(System.Exception ex) { //string str=ex.Message;// 记录错误日志 return null; } } /// <summary> /// 创建CustEmployee数据层接口 /// </summary> public static SmsSystem.IDAL.ICustEmployee CreateCustEmployee() { string CacheKey = path + ".CustEmployee"; object objType = CreateObject(path, CacheKey); return (ICustEmployee)objType; } ………………(其它数据层接口) } |
由这一个类,就可以获取需要用的数据访问层的实例,可是,我在使用过程中却总是抛出异常,[System.IO.FileNotFoundException] = {"未能加载文件或程序集“SmsSystem.SQLServerDAL”或它的某一个依赖项。系统找不到指定的文件。":"SmsSystem.SQLServerDAL"} ,说实话,对于C#这排错和调试我还手生,我百思不得其解,为什么会一用反射就异常呢,整个上去我去看反射的IPA,感觉我的用法没错误啊,况且,我看PetShop的例子就是这样差不多的写法,它为什么能用,下午调试了好久还是在出错,我发狠心去和petShop去对比,后来终于发现,它的dll的名字有些怪,和我的不同,它的都是如PetShop.SQLServerDAL.dll这样的名字,而我的就是个SQLServerDAL.dll,我感觉极有可能是这里有问题,因为在wb.config里我配置过
<appSettings> <add key="DAL" value="SmsSystem.SQLServerDAL"/> ………… </appSettings> |
这样一个程序集,搞了好久,请教别人,结果弄清楚,是要项目的属性里设置程序集的名称,就可以生成SmsSystem.SQLServerDAL.dll这样的dll文件
设置,重新生成 ,又出了一点问题,
类型“SmsSystem.BLL.CustEmployee”同时存在于“c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files
\smssystem\3358d7f2\16ba9bb7\assembly\dl3\7296d5df\40ded961_96d8c601\BLL.DLL”
和“c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\smssystem\3358d7f2
\16ba9bb7\assembly\dl3\644d894c\4cf8840a_9ad8c601\SmsSystem.BLL.DLL”
中 G:\ASP.NET\SmsSystem\Default.aspx.cs 22
我仔细一看,原来在web项目的bin下面,原来的SQLServerDAL.dll还在,又多了个SmsSystem.SQLServerDAL.dll,哈哈,vs2005又一个没有自动删除掉的多余文件,昨天是一个项目文件AssemblyInfo.cs删除掉后,在相应的删除文件竟然没删除,不过,我把它手工删除掉,OK,一切正常,还是感谢告诉我怎么样改项目的Assembly name的朋友,不然我竟然找好久也不晓得怎么生成带上命名空间的dll。