最近一段时间一直在看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>
可以轻松实现扩展和移植
博主从Community Server借鉴方法,用于解决业务实体由多数据库提供或代码移植问题。通过定义数据实体类、多个映射类,在配置文档填入类名,读配置文档反射提供业务实体,客户端调用。移植扩展时,只需改变配置文件type值,可轻松实现。
114

被折叠的 条评论
为什么被折叠?



