项目DALFactory是采用工厂模式设计的,设计模式的书我也曾看过java的设计模式,理解也不太深刻,但对工长模式还是较为熟悉,使用它可以根据需求返回不同的实例对象,在DALFactory项目中使用反射机制来实现依赖注入,当然,它的实现还是没有java中的spring那样灵活,强大,部分代码如下:
using System.Reflection;
using System.Configuration;
using PetStore.IDAL;
namespace PetStore.DALFactory
{
/// <summary>
/// 抽象工厂模式创建DAL。
/// web.config 需要加入配置:(利用工厂模式+反射机制+缓存机制,实现动态创建不同的数据层对象接口)
/// DataCache类在导出代码的文件夹里
/// 可以把所有DAL类的创建放在这个DataAccess类里
/// <appSettings>
/// <add key="WebDAL" value="PetStore.SQLServerDAL" /> (根据实际情况更改为自己项目的命名空间)
/// </appSettings>
/// </summary>
public sealed class DataAccess
{
private static readonly string path = System.Configuration.ConfigurationSettings.AppSettings[ " DAL " ];
/// <summary>
/// 创建对象或从缓存获取
/// </summary>
public static object CreateObject( string path, string CacheKey)
{
object objType = DataCache.GetCache(CacheKey); // 从缓存读取
if (objType == null )
{
try
{
objType = Assembly.Load(path).CreateInstance(CacheKey); // 反射创建
DataCache.SetCache(CacheKey, objType); // 写入缓存
}
catch
{}
}
return objType;
}
/// <summary>
/// 创建Account数据层接口
/// </summary>
public static PetStore.IDAL.IAccount CreateAccount()
{
string CacheKey = path + " .Account " ;
object objType = CreateObject(path,CacheKey);
return (IAccount)objType;
}
}
}
也可以不使用缓存,都是一样的效果。当然使用缓存优点是不用说的了.....
public static PetStore.IDAL.IAccount Create() {
string className = path + " .Account " ;
// Using the evidence given in the config file load the appropriate assembly and class
return (PetStore.IDAL.IAccount)Assembly.Load(path).CreateInstance(className);
}
由这一个类,就可以获取需要用的数据访问层的实例,可是,我在使用过程中却总是抛出异常,[System.IO.FileNotFoundException] = ,说实话,对于C#这排错和调试我还手生,我百思不得其解,为什么会一用反射就异常呢,整个上去我去看反射的IPA,感觉我的用法没错误啊,况且,我看PetShop的例子就是这样差不多的写法,它为什么能用,下午调试了好久还是在出错,后来有幸查到开发者在线 Builder.com.cn作者cleverfoxloving的一篇Blog,经研究终于发现,它的dll的名字有些怪,和我的不同,它的都是如PetShop.SQLServerDAL.dll这样的名字,而我的就是个SQLServerDAL.dll,我感觉极有可能是这里有问题,因为在wb.config里我配置过
< add key ="WebDAL" value ="PetStore.SQLServerDAL" />
< add key ="SQLConnString1" value ="server=.;database=MSPetShop;uid=sa;pwd=sa;" />
</ appSettings >
看到Blog上的知道是因为是要项目的属性里设置程序集的名称,就可以生成PetStore.SQLServerDAL.dll这样的dll文件:
类型“PetStore.BLL.Account”同时存在于“c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET Files
smssystem58d7f2ba9bb7assemblydl396d5dfded961_96d8c601BLL.DLL”
和“c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET Filessmssystem58d7f2
ba9bb7assemblydl34d894ccf8840a_9ad8c601SmsSystem.BLL.DLL”中
原来在web项目的bin下面,原来的SQLServerDAL.dll还在,又多了个PetStore.SQLServerDAL.dll,哈哈,vs2005/vs2005 都又一个没有自动删除掉的多余文件的B,,不过,我把它手工删除掉,OK,一切正常,还是感谢这篇Blog,不然我好久也不晓得怎么生成带上命名空间的dll。