在用工厂模式做三层架构开发的时候 无法反射创建类实例的发现的错误
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;
}
}
}
如果大家觉得我说得不太清楚或还有什么其它的问题可以回复;
大家一起讨论和学习一下;
共同进步!!
调试了半天也没有发现问题的所在,只是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;
}
}
}
如果大家觉得我说得不太清楚或还有什么其它的问题可以回复;
大家一起讨论和学习一下;
共同进步!!
相关文章推荐
- 动软代码生成器中DbToCodeDemo示例项目源码DALFactory无法反射创建类实例的常见错误说明
- 关于DALFactory无法反射创建类实例的常见错误说明
- 无法反射创建类实例错误的解决
- DbToCodeDemo示例项目源码DALFactory无法反射创建类实例的常见错误说明
- 动软项目DALFactory无法反射创建类实例的常见错误
- DbToCodeDemo示例项目源码DALFactory无法反射创建类实例的常见错误说明
- DbToCodeDemo示例项目源码DALFactory无法反射创建类实例的常见错误说明
- DbToCodeDemo示例项目源码DALFactory无法反射创建类实例的常见错误说明
- 抽象工厂模式:简单工厂模式、工厂方法模式对比;在工厂方法模式中使用反射创建对象实例
- 用VC6.0开发PPT插件时出现:PowerPoint发现无法更正的错误。最好保存演示文稿并退出,然后重启PowerPoint。
- Eclipse在开发android应用的时候出现存储空间不足而无法安装apk的错误
- java 反射解析,将反射用于工厂模式【实例】
- Java基础之反射及动态代理,反射实现工厂模式
- 基于工厂模式的三层架构
- 用三层架构与设计模式思想部署企业级数据库业务系统开发
- 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: SQL
- 由于最近开发服务器送修,临时需要在windows7 下搭建一个CVS, 使用CVSNT, 但是发现安装后CVSNT Contral Panel无法使用。
- .Net中的设计模式——从实例谈OOP、工厂模式和重构
- 设计模式实践-反射到所有接口实现类实践工厂方法,页面中有大量计算数据时设计实践
- SQL Network Interfaces, error: 50 - 发生了 Local Database Runtime 错误。无法创建自动实例。