如果谁对这个东西有兴趣,可以给我留言。源码奉上,初来乍到,大家捧捧场。
背景
公司做项目用的是Framework 2.0 ,经常开发的是基于webservice 的后台,使用传统的Sql方式,数据库不容易维护,使用ORM时,Webserive对自定义数据类型的支持个人感觉不是很好,装换效率低下,加上有些项目不是很大,用NHibernate显得有点重量级。于是,自己写了一个基于DataTable的分层框架,封装了事务,典型的增删改查,缓存(包括服务缓存和查询缓存)。
设计思路
该框架主要是基于DataTable进行构建,以DataTable作为标准数据接口来方便WebService的调用。封装了基本的增删改查和数据缓存功能。
使用方法
1 准备工作
1.1 将数据中每个表对应为程序中的实体,实体必须继承抽象类AbstractEntiy,并实现其抽象方法。基本格式如下:
public class FZGL:AbstractEntiy //继承抽象实体
{
#region 字段
public static string TableName = "FZGL";//定义改实体对应的数据库中表名字
//定义一些常量字符串,为从数据库中的字段对应的在系统中的名字
public static string FZID = "FZID";
public static string FZMC = "FZMC";
public static string FZSM = "FZSM";
#endregion
public FZGL(){
//添加映射,第一个字符串是在系统中的列的名字,第二个是在数据库中列的名字
filedMapping.AddWithOutError(FZID, "FZID");
filedMapping.AddWithOutError(FZMC, "FZMC");
filedMapping.AddWithOutError(FZSM, "FZSM");
}
//返回系统主键,暂时不支持多主键
internal override string GetPrimaryKey()
{
return FZID;
}
//返回实体对应的数据表名字
internal override string GetTableName()
{
return TableName;
}
internal override System.Collections.Generic.IList<string> GetUnUpdateColumns()
{
IList<String> unUpdateColumns = new List<string>();
//unUpdateColumns.Add();
return unUpdateColumns;
}
}
注:考虑到反射比较耗时,加上时间仓促,所以采用了自己设定,而不是由程序反射或特性来实现与数据库的映射
1.2 定义数据业务类,继承:EntiyBL
如下:
public class XTFWBL : EntiyBL<XTFW>
{
}
至此,业务对象XTFWBL拥有了增删改查操作
2 使用
以查询“应用最新组件”为例
2.1 查询
[WebMethod]
public DataTable GetNewestCompant(string AppId)
{
//对大数据量对象或这频繁访问的数据对象做业务缓存,格式如下
//业务缓存名格式: 命名空间+类目+方法名+“(”+每个参数值+“)”
string cacheServiceName = "XTFWService.GetNewestCompant(" + AppId + ")";
if (DataCache.ExistServiceCache(cacheServiceName))
{
return DataCache.GetServiceCache(cacheServiceName);
}
//调用Search方法查询对应的数据,条件格式为“条件1&&条件2||条件3”
//找到系统所有的分组
DataTable dtXTYFZLX = blXTYFZLX.Search(XTYFZLX.APP_ID + "=" + AppId);
//找到分组所有的信息
DataTable dtNewestZJ = null;
foreach (DataRow row in dtXTYFZLX.Rows)
{
DataTable dtTempZJ = blZJGL.Search(ZJGL.FZID + "=" + row[XTYFZLX.FZID]);
dtTempZJ.Merge(dtTempZJ, true, MissingSchemaAction.Add);
}
DataCache.SetServiceCache(cacheServiceName, dtNewestZJ);
return dtNewestZJ;
}
注:blXTFW.SearchBySql(sql)//对于特殊的可以采用传递Sql语句,尽量不要用,否则更改数据库字段后难以维护
2.2 更新
XTFWBL blXTFW = new XTFWBL();
blXTFW.SaveOrUpdate(dtNeedUpdateOrSave);// dtNeedUpdateOrSave更改后的数据表,可自动判断是更新还是新增,从效率方向考虑,应该每次只传递更改后的数据行
2.3 删除
XTFWBL blXTFW = new XTFWBL();
blXTFW.Del(idStr);
idStr:要删除的行的行号,分号分割,格式:1;2;8
前台:
1 需要做的工作:
新建对应实体: 格式如下
/// <summary>
/// 系统服务
/// </summary>
public class XTFW
{
//这个字段和后台要对应
#region 字段
public const string TableName = "XTFW";
public const string APP_ID = "APP_ID";
public const string SERVERIP = "SERVERIP";
public const string XT_ID = "XT_ID";
public const string APPTITLE = "APPTITLE";
public const string XTMC = "XTMC";
public const string SERVERPORT = "SERVERPORT";
public const string SERVERTYPE = "SERVERTYPE";
public const string SERVERURL = "SERVERURL";
public const string SERVERWSDLURL = "SERVERWSDLURL";
#endregion
}
本来准备支持多对多,一对多等关系,现在也没有时间,加上发现微软后期的产品加入了对ORM的支持,所以觉得适用范围会越来越窄,就不打算在做了,如果谁对这个东西有兴趣,可以联系我。