Posted on 2006-02-18 23:20
李天平 阅读(9341)
评论(37) 编辑 收藏
有些朋友在做我提供的基于接口和工厂模式的三层架构示例项目代码时,经常会在DALFactory类厂部分出现无法反射创建类示例的错误。就网友来信询问最多的情况,在此作一个统一说明,如果你也遇到了同样的问题,请参考。
DALFactory源码:
string path = System.Configuration.ConfigurationSettings.AppSettings["DAL"];//从web.config里获得数据层的程序集名
string CacheKey = path+".SysManage"; //程序集+类名,得到类的类型全名
object objType = DataCache.GetCache(CacheKey);
if (objType == null)
{
try
{
objType = Assembly.Load(path).CreateInstance(CacheKey); // 经常出错行
DataCache.SetCache(CacheKey, objType);// 写入缓存
}
catch(System.Exception ex)
{
string str=ex.Message;
}
}
return (AdDesktop.IDAL.ISysManage)objType;
错误说明:
1.每一层是否是独立的程序集(也就是独立的项目)
因为Assembly.Load(path)这里的path必须是一个程序集的名称,而不是类命名空间的名称。
2.请检查数据层是否实现了接口。
SQLServerDAL下面的具体类是否实现了接口的定义,如:

3.请检查程序集名称和命名空间不一致。
因为Assembly.Load(path)这里的path必须是一个程序集的名称
CreateInstance(CacheKey)这里的CacheKey其实是需要反射的类型全名(包括命名空间的全路径)。
所以,尽量让程序集名称和命名空间一致,这样的得到的类型全名=程序集名称+类名。
否则,你需要把CacheKey换成实际的类型全名。
4.请检查BLL层是否添加了SQLServerDAL的项目引用。
如果你发现还有其他问题,可以回贴,让大家都学习一下。
最新版下载:http://www.maticsoft.com/softdown.aspx
Feedback
一般这个项目不会同时使用多数据库 的吧
所以我把他们给合并了
因为Assembly.Load(path)这里的path必须是一个程序集的名称,而不是类命名空间的名称。
记得自己第一次使用工厂模式的时候也确实为此事耽误拉不少时间!
汗$%^&*
还是好好学习 天天向上吧
关键字段能不能多增加几个,让可以选择的。
假如使用是否存在记录的时候,只通过一个id好像不太现实吧。
删除语句好像少了一个from
对项目发布这个始终没用起过啊。
是不是发布项目就导出了表中的所有生成。
但我一用就挂程序。能说明下么。之能一个表一个表的保存哦。
就只有选择代码输出功能。但那就要自己建项目,然后加入这些文件了。
生成DAL层似乎有不确切的地方。
所有的ID字段的都按ID来取值。如模型层里我的自动编号字段是AdmID但DAL层都是model.ID来取值的,要手动修改。
这个问题我一直没得到解决,只有改用简单三层模式,等哪天解决了再换回工厂模式。我用的vs2005,现在petshop4.0已经发布,基于.net2.0的,很希望天平看看,发布一个支持.net2.0的。谢谢。
--------这么好用还提这么多要求,我是不是有些过分
@Hurry ,如果不用考虑扩展其他类型数据库,建议还是使用简单3层结构,因为反射从一定程度上有一些性能问题。
@周伟,这个问题确实需要自己根据实际情况修改条件部分啦。我以后考虑一个灵活的方式来解决这个问题。“删除语句少from”,SQLServer是允许这种写法的。
@zkxp,自动编号字段是AdmID但DAL层都是model.ID来取值的,请问你的是1.9.6吗,我测试了好像没有这个问题,你能具体说一下吗?
@poo,谢谢你一直的关注,基于.net2.0的版本正在开发中了。
你给的DbToCodeDemo不是一个完整的源代码,而且也没有完整的把你的代码生成器生成的代码做成范例。希望能给个完整的范例好让初学的了解如何将代码生成运用到实践中。
运行DbToCodeDemo进入后台管理时,左边的菜单管理项目点不了啊?
恩,我在学习阶段,看了感觉不错
尤其是这个说明:objType = Assembly.Load(path).CreateInstance(CacheKey); // 经常出错行
昨天郁闷了一下午,才搞明白。
DataCache 从哪来的 好象没有这个命名空间
晕,第4点里BLL层怎么会直接引用到数据层去了。举的例子不是基于工厂模式的么。那第3点怎么又有接口层呢。
另。FACTORY层了少了DATACACHE文件啊。
我搞了一上午,发现同样的错误,原来是在web的引用里要加入SqlserverDal.呵呵。
下载了DbToCodeDemo.rar,但没有数据库呀,楼主能不能提供。研究DBToCode。
我弄了一下午,工厂那里总是不对,在web页测试时 出现“ 未将对象引用设置到对象的实例“。 at jiayong.BLL.Down.GetModel(Int32 ID),不只怎么事,请求帮忙啊
@fangzh,CodematicDemo只是一个示例项目,主要是让大家便于理解这个架构设计,里面的代码基本就是代码生成器生成的。
@yynice,你是否装了微软的iewebcontrols控件,我好像在说明了一再强调了。
@什么样,DataCache 可以通过导出文件导出,也可以自己去目录下复制那个文件,示例项目里也有这个文件。
@tianjj,我在说明里已经写了数据库就在文件夹里。
@langzifengsha,你的问题说的太简单,不知道你到底错在哪里了。
事例代码网上下载的不能解压缩啊!!!
楼主有空麻烦将DEMO发给我,谢谢
seanxuan6@hotmail.com
希望能给个完整的范例好让初学的了解如何将代码生成运用到实践中。
System.NullReferenceException: 未将对象引用设置到对象的实例。
我使用的时候也是出现这种错误:"未将对象引用设置到对象的实例",
行 62: public KQ.Model.Department GetModel(int DeptId)
行 63: {
行 64: return dal.GetModel(DeptId);
行 65: }
行 66:
源文件: d:\codematic\kqweb\bll\department.cs 行: 64
怎么解决啊?
我试了很久还没有做清除(我建了个test项目),文中提到“每一层是独立的程序集”,那是不是要建BLL,IDAL,Model,SQLServerDal,DALFactory五个项目分别输出他们的形如BLL.dll的文件还是test.Bll.dll的?然后再引用到项目test下?
我发现你的2.0的生成器有好几个问题, 但是一直找不到发帖的地方,郁闷.
项目运行时出现:Error while trying to run project: Unable to start debugging on the web server. The project is not configured to be debugged
如何解决
天道酬勤 你好。我按照你在这边文章中的介绍,一个一个的检查我的程序,完全符合你文章中的描述,怎么还是出现“未能加载文件或程序集“Seagolden.App.Manifest.SQLServerDAL”或它的某一个依赖项。系统找不到指定的文件。 ”错误?请问应该如何做,才能解决这个错误呢?
objType = Assembly.Load(path).CreateInstance(CacheKey);//反射创建
程序运行到这里,就会报错,未能加载文件或程序集"**.SQLServerDAL"或它的一个依赖项。系统找不到指定的文件。
几乎所有的引用都添加了,还是出错,请问李老师该如何解决啊
objType = Assembly.Load(path).CreateInstance(CacheKey);//反射创建
程序运行到这里,就会报错,未能加载文件或程序集"**.SQLServerDAL"或它的一个依赖项。系统找不到指定的文件。
几乎所有的引用都添加了,还是出错,请问李老师该如何解决啊
谢谢李老师的这个软件.我过段时间毕业后重新找工作.
肯定能用的上的..
李老師我想請教,你的示例數據庫在哪里可以下載,我一直都沒有找到?》?萬分感謝。。。。
为什么一定要在web层对数据访问层引用?
可能自己的反射还是理解的不透彻,能否指点一二?
同样有此疑问,为什么还需要对数据引用层进行引用,才可以用呢?
objType = Assembly.Load(path).CreateInstance(CacheKey);//反射创建
程序运行到这里,就会报错,未能加载文件或程序集"**.SQLServerDAL"或它的一个依赖项。系统找不到指定的文件。
几乎所有的引用都添加了,还是出错,请问李老师该如何解决啊