这些天,我在试着用工厂模式和接口来做三层架构的时候,碰到一个问题,开始是非常棘手啊!!
调试了半天也没有发现问题的所在,只是objType = Assembly.Load(path).CreateInstance(CacheKey); //反射创建这一句的时候老是出错。。我唯有改成创建我需要的某一个具体的类进行调试的时候,才一个个问题解决;
但问题来了,我解决掉那里之后,改回来还是不行啊;
在经过多次调试发现,Assembly不是有关程序集操作的类吗;
所以将之改成程序集名称,同时也把程序集的名称改成命名空间的前缀;
统一用PowerNet.DataLog;将命名空间的前缀改成程序集的名称(在此要修改一下程序集的名称“工程名”->“属性”里面就以修改);
这样就调试通过了;
说明:本代码中用到的这些都是通过一个生成代码的工具生成的,这个生成工具非当没有让我尝到“甜头”反而让我苦了不少,当然也正因如此,也对于三层架构和工厂模式有了进一步深入的一点点了解吧;呵呵...有的时候这些工具生成的代码的确感觉编译通过不了。调试很久也无奈,但试着顺藤摸瓜一个个有耐心地去解决的话。还是能够搞定的。当然最重要的是在这个过程中能学到不少东西;
下面是DALFactory整个类DataAccess的源码
using
System;
using System.Reflection;
using System.Configuration;
using PowerNet.DataLog.IDAL.Table;
namespace PowerNet.DataLog.DALFactory.Table
... {
/**//// <summary>
/// 抽象工厂模式创建DAL。
/// web.config 需要加入配置:(利用工厂模式+反射机制+缓存机制,实现动态创建不同的数据层对象接口)
/// DataCache类在导出代码的文件夹里
/// 可以把所有DAL类的创建放在这个DataAccess类里
/// <appSettings>
/// <add key="DAL" value="PowerNet.DataLog" /> (这里的根据实际情况更改为自己项目的程序集名称)
/// </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(Exception)
...{
return null;
}
}
return objType;
}
/**//// <summary>
/// 创建DataAnalyse数据层接口
/// </summary>
public static PowerNet.DataLog.IDAL.Table.IDataAnalyse CreateDataAnalyse()
...{
string CacheKey = path+".DAL.Table.DataAnalyse";
object objType=CreateObject(path,CacheKey);
return (IDataAnalyse)objType;
}
/**//// <summary>
/// 创建OnlineCount数据层接口
/// </summary>
public static PowerNet.DataLog.IDAL.Table.IOnlineCount CreateOnlineCount()
...{
string CacheKey = path+".DAL.Table.OnlineCount";
object objType=CreateObject(path,CacheKey);
return (IOnlineCount)objType;
}
/**//// <summary>
/// 创建GameLog数据层接口
/// </summary>
public static PowerNet.DataLog.IDAL.Table.IGameLog CreateGameLog()
...{
string CacheKey = path+".DAL.Table.GameLog";
object objType=CreateObject(path,CacheKey);
return (IGameLog)objType;
}
}
}
using System.Reflection;
using System.Configuration;
using PowerNet.DataLog.IDAL.Table;
namespace PowerNet.DataLog.DALFactory.Table
... {
/**//// <summary>
/// 抽象工厂模式创建DAL。
/// web.config 需要加入配置:(利用工厂模式+反射机制+缓存机制,实现动态创建不同的数据层对象接口)
/// DataCache类在导出代码的文件夹里
/// 可以把所有DAL类的创建放在这个DataAccess类里
/// <appSettings>
/// <add key="DAL" value="PowerNet.DataLog" /> (这里的根据实际情况更改为自己项目的程序集名称)
/// </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(Exception)
...{
return null;
}
}
return objType;
}
/**//// <summary>
/// 创建DataAnalyse数据层接口
/// </summary>
public static PowerNet.DataLog.IDAL.Table.IDataAnalyse CreateDataAnalyse()
...{
string CacheKey = path+".DAL.Table.DataAnalyse";
object objType=CreateObject(path,CacheKey);
return (IDataAnalyse)objType;
}
/**//// <summary>
/// 创建OnlineCount数据层接口
/// </summary>
public static PowerNet.DataLog.IDAL.Table.IOnlineCount CreateOnlineCount()
...{
string CacheKey = path+".DAL.Table.OnlineCount";
object objType=CreateObject(path,CacheKey);
return (IOnlineCount)objType;
}
/**//// <summary>
/// 创建GameLog数据层接口
/// </summary>
public static PowerNet.DataLog.IDAL.Table.IGameLog CreateGameLog()
...{
string CacheKey = path+".DAL.Table.GameLog";
object objType=CreateObject(path,CacheKey);
return (IGameLog)objType;
}
}
}
如果大家觉得我说得不太清楚或还有什么其它的问题可以回复;
大家一起讨论和学习一下;
共同进步!!