您的位置:首页 > 运维架构 > 网站架构

在用工厂模式做三层架构开发的时候 无法反射创建类实例的发现的错误

2007-04-20 15:30 531 查看
这些天,我在试着用工厂模式和接口来做三层架构的时候,碰到一个问题,开始是非常棘手啊!!
调试了半天也没有发现问题的所在,只是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;


}




}


}





如果大家觉得我说得不太清楚或还有什么其它的问题可以回复;

大家一起讨论和学习一下;

共同进步!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐