to be king
bigpig的.net世界

最近一段时间一直在看Community Server, 从中抄了不少宝到项目里去。

场景: 业务实体由多个不同数据库提供,或是为了方便代码移植到不同数据库上去

借鉴方法: 在CS中采取了从配置文件读取映射类的方法,可以非常灵活的定义数据源。

举例步骤:  1 定义数据实体类User
            public class User:IPeople
          {
                private int _settingID;
                private string _userID;
                private string _userName;
                private string _time;
                 private string _language;
               
                属性:
            }
         
            2 定义多个映射类,对应不同数据库   

             public interface IUserProvider
            {
                  IPeople  GetUserByID(int ID);
                  IPeople  GetNameByID(int ID);
                  IPeople  GetUserByName(string name);
                  .....
            }

            public class UserProviderBySQL:DBHelper,IUserProvider
           {
                  .......
           }

           public class UserProviderByOracle:DBHelper,IUserProvider
           {
                  .......
           }

         3 在配置文档里填入类名
           <?xml version="1.0" encoding="utf-8" ?>
           <root>
           <add name="UserAppDAL" type="AppDAL.UserProviderBySQL"></add>    
          </root>
   
         4 读配置文档然后通过反射来提供业务实体
          

public class ConfigManager
{
           ..

  
public static object GetObjectByName(string name)
                   
{
                        XmlDocument d 
= new XmlDocument();
                        d.Load(filename);
                        
foreach (XmlNode n in d.SelectSingleNode("root").ChildNodes) 
                        
{
                                     
if (n.Attributes["name"].Value == name) 
                                     
{
                                     typeStr 
= n.Attributes["type"].Value;
                                     }

                          }


                        
if(typeStr == "")
                       
{
                                     
throw new TestException("没有找到你要调用的类");
                        }


                        Type controlType 
= Type.GetType(typeStr,true);     //由反射得到类型
                        object obj = Activator.CreateInstance(controlType);
   
                         
return obj;
                 }

                        
                        

}

         5  客户端调用
                  

public class Users
                 
{
                        .
                       
public static AppDAL.IPeople GetUserByName(string name)
                        
{
                                      AppDAL.IPeople  _user 
= null;
     
                                      cacheName 
= "nameKey_"+name;

                                      _user 
= ExtendedCache.Get(cacheName) as AppDAL.IPeople; //先查缓存
                                      if(_user == null)
                                     
{
                                         
//由配置文件得到映射类   
                                        IUserProvider _userProvider = 
                                       ConfigManagerDAL.GetObjectByName (
"UserAppDAL")  as IUserProvider;         
                                        _user 
= _userProvider.GetUserByName(name);   
                                        ExtendedCache.Insert(cacheName, _user);
                                         }

                                     
return _user;

                       }

                       ..
                 }


 
          
          6 移植扩展
                只需要改变配置文件中的type值即可更换映射类如
                <add name="UserAppDAL" type="AppDAL.UserProviderByOracle"></add>
                可以轻松实现扩展和移植

posted on 2005-12-14 11:33  wulei  阅读(270)  评论(0)    收藏  举报