科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件疑问解惑 使用C#的反射机制时遇到的问题

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

项目DALFactory是采用工厂模式设计的,设计模式的书我也曾看过Java的设计模式,理解也不太深刻,但对工厂模式还是较为熟悉,使用它可以根据需求返回不同的实例对象,在DALFactory项目中使用反射机制来实现依赖注入,当然,它的实现还是没有java中的spring那样灵活,强大

来源:soft6 2008年5月22日

关键字: 机制 反射 C# Windows

  • 评论
  • 分享微博
  • 分享邮件
项目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] = ,说实话,对于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:WindowsMicrosoft.netFrameworkv2.0.50727Temporary ASP.NET Files

  smssystem58d7f2ba9bb7assemblydl396d5dfded961_96d8c601BLL.DLL”

  和“c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET Filessmssystem58d7f2

  ba9bb7assemblydl34d894ccf8840a_9ad8c601SmsSystem.BLL.DLL”

  中 G:ASP.NETSmsSystemDefault.aspx.cs 22

  我仔细一看,原来在web项目的bin下面,原来的SQLServerDAL.dll还在,又多了个SmsSystem.SQLServerDAL.dll,哈哈,vs2005又一个没有自动删除掉的多余文件,昨天是一个项目文件AssemblyInfo.cs删除掉后,在相应的删除文件竟然没删除,不过,我把它手工删除掉,OK,一切正常,还是感谢告诉我怎么样改项目的Assembly name的朋友,不然我竟然找好久也不晓得怎么生成带上命名空间的dll。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章