仿PetShop,C#反射机制为题解答

 

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

using  System;
using  System.Reflection;
using  System.Configuration;
using  PetStore.IDAL;
namespace  PetStore.DALFactory
{
    
///   <summary>
    
///  抽象工厂模式创建DAL。
    
///  web.config 需要加入配置:(利用工厂模式+反射机制+缓存机制,实现动态创建不同的数据层对象接口)  
    
///  DataCache类在导出代码的文件夹里
    
///  可以把所有DAL类的创建放在这个DataAccess类里
    
///   <appSettings>   
    
///   <add key="WebDAL" value="PetStore.SQLServerDAL" />  (根据实际情况更改为自己项目的命名空间)
    
///   </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
                {}
            }
            
return  objType;
        }
        
///   <summary>
        
///  创建Account数据层接口
        
///   </summary>
         public   static  PetStore.IDAL.IAccount CreateAccount()
        {
            
string  CacheKey  =  path + " .Account " ;
            
object  objType = CreateObject(path,CacheKey);
            
return  (IAccount)objType;
        }
    }
}

也可以不使用缓存,都是一样的效果。当然使用缓存优点是不用说的了.....

// 不使用Cache
public   static  PetStore.IDAL.IAccount Create() {                
     
string  className  =  path  +   " .Account " ;

     
//  Using the evidence given in the config file load the appropriate assembly and class
      return  (PetStore.IDAL.IAccount)Assembly.Load(path).CreateInstance(className);
}

  由这一个类,就可以获取需要用的数据访问层的实例,可是,我在使用过程中却总是抛出异常,[System.IO.FileNotFoundException] = ,说实话,对于C#这排错和调试我还手生,我百思不得其解,为什么会一用反射就异常呢,整个上去我去看反射的IPA,感觉我的用法没错误啊,况且,我看PetShop的例子就是这样差不多的写法,它为什么能用,下午调试了好久还是在出错,后来有幸查到开发者在线 Builder.com.cn作者cleverfoxloving的一篇Blog,经研究终于发现,它的dll的名字有些怪,和我的不同,它的都是如PetShop.SQLServerDAL.dll这样的名字,而我的就是个SQLServerDAL.dll,我感觉极有可能是这里有问题,因为在wb.config里我配置过

< appSettings >
    
< add  key ="WebDAL"  value ="PetStore.SQLServerDAL"   />
    
< add  key ="SQLConnString1"  value ="server=.;database=MSPetShop;uid=sa;pwd=sa;"   />
 
</ appSettings >

看到Blog上的知道是因为是要项目的属性里设置程序集的名称,就可以生成PetStore.SQLServerDAL.dll这样的dll文件:

  类型“PetStore.BLL.Account”同时存在于“c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET Files
smssystem58d7f2ba9bb7assemblydl396d5dfded961_96d8c601BLL.DLL”
和“c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET Filessmssystem58d7f2
ba9bb7assemblydl34d894ccf8840a_9ad8c601SmsSystem.BLL.DLL”中
  原来在web项目的bin下面,原来的SQLServerDAL.dll还在,又多了个PetStore.SQLServerDAL.dll,哈哈,vs2005/vs2005 都又一个没有自动删除掉的多余文件的B,,不过,我把它手工删除掉,OK,一切正常,还是感谢这篇Blog,不然我好久也不晓得怎么生成带上命名空间的dll。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值