首页 > 开发 > 综合 > 正文

使用C#的反射机制时遇到的问题

2024-07-21 02:28:36
字体:
来源:转载
供稿:网友
  项目dalfactory是采用工厂模式设计的,设计模式的书我也曾看过java的设计模式,理解也不太深刻,但对工厂模式还是较为熟悉,使用它可以根据需求返回不同的实例对象,在dalfactory项目中使用反射机制来实现依赖注入,当然,它的实现还是没有java中的spring那样灵活,强大,部分代码如下:

// <summary>
/// 抽象工厂模式创建dal。
/// web.config 需要加入配置:(利用工厂模式+反射机制+缓存机制,实现动态创建不同的数据层对象接口)
/// datacache类在导出代码的文件夹里
/// 可以把所有dal类的创建放在这个dataaccess类里
/// <appsettings>
/// <add key="dal" value="smssystem.sqlserverdal" /> (这里的命名空间根据实际情况更改为自己项目的命名空间)
/// </appsettings>
/// </summary>
public sealed class dataaccess
{
private static readonly string path = configurationmanager.appsettings["dal"];
/// <summary>
/// 创建对象或从缓存获取
/// </summary>
public static object createobject(string path, string cachekey)
{
 object objtype = datacache.getcache(cachekey);//从缓存读取
 if (objtype == null)
 {
  try
  {
   //assembly ass = new assembly();
   objtype = assembly.load(path).createinstance(cachekey);//反射创建
   datacache.setcache(cachekey, objtype);// 写入缓存
  }
  catch(system.exception ex)
  {
   string str = ex.message;//
   smssystem.utility.savelog.saveinfotolog(str, "errorlog", "异常");
  }
 }
 return objtype;
}
/// <summary>
/// 不使用缓存,创建对象
/// </summary>
private static object createobjectnocache(string path, string cachekey)
{
 try
 {
  object objtype = assembly.load(path).createinstance(cachekey);
  return objtype;
 }
 catch//(system.exception ex)
 {
  //string str=ex.message;// 记录错误日志
  return null;
 }
}
/// <summary>
/// 创建custemployee数据层接口
/// </summary>
public static smssystem.idal.icustemployee createcustemployee()
{
 string cachekey = path + ".custemployee";
 object objtype = createobject(path, cachekey);
 return (icustemployee)objtype;
}
………………(其它数据层接口)
}

  由这一个类,就可以获取需要用的数据访问层的实例,可是,我在使用过程中却总是抛出异常,[system.io.filenotfoundexception] = {"未能加载文件或程序集“smssystem.sqlserverdal”或它的某一个依赖项。系统找不到指定的文件。":"smssystem.sqlserverdal"} ,说实话,对于c#这排错和调试我还手生,我百思不得其解,为什么会一用反射就异常呢,整个上去我去看反射的ipa,感觉我的用法没错误啊,况且,我看petshop的例子就是这样差不多的写法,它为什么能用,下午调试了好久还是在出错,我发狠心去和petshop去对比,后来终于发现,它的dll的名字有些怪,和我的不同,它的都是如petshop.sqlserverdal.dll这样的名字,而我的就是个sqlserverdal.dll,我感觉极有可能是这里有问题,因为在wb.config里我配置过

<appsettings>
<add key="dal" value="smssystem.sqlserverdal"/>
…………
</appsettings>

  这样一个程序集,搞了好久,请教别人,结果弄清楚,是要项目的属性里设置程序集的名称,就可以生成smssystem.sqlserverdal.dll这样的dll文件


  设置,重新生成 ,又出了一点问题,

  类型“smssystem.bll.custemployee”同时存在于“c:/windows/microsoft.net/framework/v2.0.50727/temporary asp.net files
/smssystem/3358d7f2/16ba9bb7/assembly/dl3/7296d5df/40ded961_96d8c601/bll.dll”
和“c:/windows/microsoft.net/framework/v2.0.50727/temporary asp.net files/smssystem/3358d7f2
/16ba9bb7/assembly/dl3/644d894c/4cf8840a_9ad8c601/smssystem.bll.dll”
中 g:/asp.net/smssystem/default.aspx.cs 22

  我仔细一看,原来在web项目的bin下面,原来的sqlserverdal.dll还在,又多了个smssystem.sqlserverdal.dll,哈哈,vs2005又一个没有自动删除掉的多余文件,昨天是一个项目文件assemblyinfo.cs删除掉后,在相应的删除文件竟然没删除,不过,我把它手工删除掉,ok,一切正常,还是感谢告诉我怎么样改项目的assembly name的朋友,不然我竟然找好久也不晓得怎么生成带上命名空间的dll。
  • 本文来源于网页设计爱好者web开发社区http://www.html.org.cn收集整理,欢迎访问。
  • 发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表