我们的C#教程中也会讲到C#设计模式,但C#设计模式涉及知识面广,我们会用专题来深入讲解C#语言体系中设计模式的问题。本文重点在于如何更好地创建数据访问层(在ASP.Net教程中还有几篇相关文章)。
工厂模式,就是类似像工厂生产东西一样的意思。只需得到出厂的东西,具体怎么生产就不知道了。拿程序来说,就是自己定义一个类,这个类当中会有很多方法,而这些方法就是创建对象的作用,用这个类的人只需知道调用哪个方法得到哪个具体对象,至于怎么得到就不用管了。工厂模式在ASP.Net教程系列文章中会经常遇到,大家可以在本站搜素中搜素。
反射机制,其实也很简单,就是一个类,可以利用反射机制得到自己有多少个方法,属性,方法名等等,这时候就可以判断这个类有无这个属性,或这个方法。从而调用该方法。关于C#的反射机制,我们会在专门的文章中讲解,我们放在了C#教程和.NET 3.5栏目分类中。
缓存机制,主要作用就是缓存一些数据。在这里不知道他到底有什么作用。但缓存机制就是起一个缓存,然后等下次调用的时候就直接从缓存中取数据。 这跟你的IE浏览器浏览网页是一个道理的。
动态创建数据访问层对象,也就是创建一些接口来编程了。比较灵活点。具体接口的实现就交给工厂模式去实现。
示例项目DALFactory是采用工厂模式设计的,设计模式的书有很多,我也曾看过《C#的设计模式》(英文原著是C# Design Patterns: A Tutorial),理解也不太深刻,但对工厂模式还是较为熟悉,使用它可以根据需求返回不同的实例对象,在DALFactory项目中使用反射机制来实现依赖注入,当然它的实现还可以更灵活,强大,有兴趣的朋友可以去研究。
部分代码如下:
// <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\3358d
和“c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\smssystem\3358d
\16ba9bb7\assembly\dl3\644d
中 G:\ASP.NET\SmsSystem\Default.aspx.cs 22
我仔细一看,原来在web项目的bin下面,原来的SQLServerDAL.dll还在,又多了个SmsSystem.SQLServerDAL.dll,哈哈,vs2005又一个没有自动删除掉的多余文件,昨天是一个项目文件AssemblyInfo.cs删除掉后,在相应的删除文件竟然没删除,不过,我把它手工删除掉,OK,一切正常,还是感谢告诉我怎么样改项目的Assembly name的朋友,不然我竟然找好久也不晓得怎么生成带上命名空间的dll。
引用来源:eefly的BLOG http://blog.sina.com.cn/eefly