c# 数据请求方式提供
营销平台数据请求介绍
项目介绍:
前端使用 WPF,采用MVVM模式 后端数据库采用的sqlite 依靠本地化运行 后期可能会采用WebApi 因为WPF都是自学的 所以 代码方面写的可能不够规范 有问题 可以指出 大家互相学习
代码已经上传至github
https://github.com/YC946586/YC.Marketing
后端:
通过DAL类 对应的自定义特性 找到对应的实现方法
接口类 定义DAL所需要的方法
/// <summary>
/// 接口层 为什么不用抽象类 因为我用动软生成数据访问层 懒得去改。
/// 等业务需要了 再改
/// </summary>
public interface IUsDataDal<T> where T : class, new()
{
/// <summary>
/// 是否存在该记录
/// </summary>
bool Exists(string zj);
/// <summary>
/// 增加一条数据
/// </summary>
void Add(T model);
/// <summary>
/// 更新一条数据
/// </summary>
bool Update(T model);
/// <summary>
/// 删除数据
/// </summary>
bool Delete(string zj);
/// <summary>
/// 得到一个对象实体
/// </summary>
T GetModel(string zj); /// <summary>
/// 附加方法 用于本身生成代码业务不支持
/// </summary>
DataSet Addition(T model);
/// <summary>
/// 获得数据列表
/// </summary>
DataSet GetList(string strWhere);
/// <summary>
/// 获得前几行数据
/// </summary>
DataSet GetList(int top, string strWhere, string filedOrder);
}
方法请求
/// <summary>
/// 数据请求
/// </summary>
/// <typeparam name="T"></typeparam>
public static class DataRequest<T> where T : class, new()
{
/// <summary>
/// 是否存在该记录
/// </summary>
public static bool Exists(dynamic zj)
{
try
{
Bridge<T> bll = new Bridge<T>();
return bll.Exists(zj);
}
catch (Exception ex)
{
return false;
}
} /// <summary>
/// 增加一条数据
/// </summary>
public static void Add(T model)
{
Bridge<T> bll = new Bridge<T>();
bll.Add(model);
} /// <summary>
/// 更新一条数据
/// </summary>
public static bool Update(T model)
{
Bridge<T> bll = new Bridge<T>();
return bll.Update(model);
} /// <summary>
/// 删除一条数据
/// </summary>
public static bool Delete(string zj)
{
Bridge<T> bll = new Bridge<T>();
return bll.Delete(zj);
} /// <summary>
/// 得到一个对象实体
/// </summary>
public static T GetModel(string zj)
{
Bridge<T> bll = new Bridge<T>();
return bll.GetModel(zj);
} /// <summary>
/// 获得数据列表
/// </summary>
public static Task<List<T>> GetModelList(string strWhere="")
{
try
{
Bridge<T> bll = new Bridge<T>();
return Task.FromResult(bll.GetModelList(strWhere));
}
catch (Exception ex)
{
throw;
}
} /// <summary>
/// 获得前几行数据
/// </summary>
public static List<T> GetList(int Top, string strWhere, string filedOrder)
{
try
{
Bridge<T> bll = new Bridge<T>();
return bll.GetList(Top, strWhere, filedOrder);
}
catch (Exception ex)
{
throw;
}
} /// <summary>
/// 附加方法 实现自己对应的逻辑
/// </summary>
public static List<T> Addition(T entity)
{
try
{
Bridge<T> bll = new Bridge<T>();
return bll.Addition(entity);
}
catch (Exception ex)
{
throw;
}
} }
定义请求方法转接到DAL的不同实现
public class Bridge<T> where T : class, new()
{
/// <summary>
/// 获取对应的数据访问层
/// </summary>
private readonly IUsDataDal<T> _dal = DataAccess.CreateusData<T>(); #region Method
/// <summary>
/// 是否存在该记录
/// </summary>
public bool Exists(string zj)
{
return _dal.Exists(zj);
}
/// <summary>
/// 增加一条数据
/// </summary>
public void Add(T model)
{
_dal.Add(model);
}
/// <summary>
/// 更新一条数据
/// </summary>
public bool Update(T model)
{
return _dal.Update(model);
} /// <summary>
/// 删除一条数据
/// </summary>
public bool Delete(string zj)
{
return _dal.Delete(zj);
} /// <summary>
/// 得到一个对象实体
/// </summary>
public T GetModel(string zj)
{
return _dal.GetModel(zj);
} /// <summary>
/// 获得前几行数据
/// </summary>
public List<T> GetList(int top, string strWhere, string filedOrder)
{
DataSet ds = _dal.GetList(top, strWhere, filedOrder);
return DataTableToList(ds);
} /// <summary>
/// 获得数据列表
/// </summary>
public List<T> GetModelList(string strWhere)
{
DataSet ds = _dal.GetList(strWhere);
return DataTableToList(ds);
} /// <summary>
/// 附加方法 实现自己对应的逻辑
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public List<T> Addition(T model)
{
DataSet ds = _dal.Addition(model);
return DataTableToList(ds);
}
#region Private methods /// <summary>
/// 获得数据列表
/// </summary>
private List<T> DataTableToList(DataSet dt)
{
var data = DataSetToEntityList<T>(dt);
List<T> modelList = data.ToList();
return modelList;
} /// <summary>
/// DataSet转换为实体列表
/// </summary>
/// <typeparam name="T">实体类</typeparam>
/// <param name="pDataSet">DataSet</param>
/// <param name="pTableIndex">待转换数据表索引</param>
/// <returns>实体类列表</returns>
private static IList<T> DataSetToEntityList<T>(DataSet pDataSet, int pTableIndex = )
{
try
{
if (pDataSet == null || pDataSet.Tables.Count < )
return default(IList<T>);
if (pTableIndex > pDataSet.Tables.Count - )
return default(IList<T>);
if (pTableIndex < )
pTableIndex = ;
if (pDataSet.Tables[pTableIndex].Rows.Count <= )
return default(IList<T>); DataTable p_Data = pDataSet.Tables[pTableIndex];
// 返回值初始化
IList<T> result = new List<T>();
for (int j = ; j < p_Data.Rows.Count; j++)
{
T _t = (T)Activator.CreateInstance(typeof(T));
PropertyInfo[] propertys = _t.GetType().GetProperties();
foreach (PropertyInfo pi in propertys)
{
if (p_Data.Columns.IndexOf(pi.Name.ToUpper()) != - && p_Data.Rows[j][pi.Name.ToUpper()] != DBNull.Value)
{
object value = p_Data.Rows[j][pi.Name.ToUpper()];
if (pi.PropertyType.FullName == "System.Int32")//此处判断下Int32类型,如果是则强转
value = Convert.ToInt32(value);
pi.SetValue(_t, value, null);
}
else
{
pi.SetValue(_t, null, null);
}
}
result.Add(_t);
}
return result;
}
catch (Exception ex)
{ throw;
} } #endregion #endregion }
通过传递的实体来找到对应的DAL接口实现
private static readonly Dictionary<string, string> DicAttribute = new Dictionary<string, string>();
#region Createus
/// <summary>
/// 获取对应的数据访问层
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static IUsDataDal<T> CreateusData<T>() where T : class, new()
{
try
{
string assemblyPath= string.Empty;
//如果已经查找到对应的Dal类就不继续找了
var fullName = typeof(T).FullName;
if (fullName != null && DicAttribute.ContainsKey(fullName))
{
assemblyPath = DicAttribute[fullName];
}
else
{
var propertys = Assembly.GetExecutingAssembly().GetTypes();
foreach (var item in propertys)
{
object[] objAttrs = item.GetCustomAttributes(typeof(DataAttribute), true); //获取自定义特性
if (objAttrs.Length == )
continue;
DataAttribute curData = objAttrs.First() as DataAttribute;
if (curData != null && curData.Data.Equals(typeof(T).FullName))
{
assemblyPath = item.FullName;
DicAttribute.Add(fullName, item.FullName);
} }
}
//通过反射获取到DAL类
var classNamespace = Assembly.Load(Assembly.GetCallingAssembly().FullName).CreateInstance(assemblyPath);
return classNamespace as IUsDataDal<T>; //方式2
//string classNamespace = AssemblyPath + ".us_gngl";
//object objType = CreateObject(AssemblyPath, classNamespace);
//return (Ius_gnglDal)objType; }
catch (Exception ex)
{ throw;
} } #endregion
DAL 定义特性
请求示例:
LoginResultData.TheMainConfig = DataRequest<UcGnglEntity>.Addition(new UcGnglEntity());
有问题可以联系QQ 29579895 或者留言
PS:为什么做这种无聊的东西 因为我最近挺闲
c# 数据请求方式提供的更多相关文章
- Layui数据表格的接口数据请求方式为Get
Layui数据表格的接口数据请求方式为Get
- axios的数据请求方式及跨域
express 的三大功能:静态资源.路由.模板引擎 app.use(express.static('www')); 只要是创建这个静态的目录,这个 www 的静态目录里面的文件就可以被访问 数据的请 ...
- android post带数据请求方式,传递的数据格式包括json和map
如下: public static String httpPost(String url, String json) { try { URL u = new URL(url); HttpURLConn ...
- Android为TV端助力 post带数据请求方式,传递的数据格式包括json和map
如下: public static String httpPost(String url, String json) { try { URL u = new URL(url); HttpURLConn ...
- Iris请求方式和数据返回类型
1. Iris起服务 package main import "github.com/kataras/iris" func main() { //1.创建app结构体对象 app ...
- jquery提供的数据提交方式2-ajax
以前介绍过ajax提交方式.但仅仅是个例子,今天将详细介绍jquery中的$.ajax,$.get,$.post方法. 一,首先介绍$.ajax方法参数(以下参数来自:http://www.cnblo ...
- HTTP 请求方式: GET和POST的比较当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。
什么是HTTP? 超文本传输协议(HyperText Transfer Protocol -- HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议. HTTP在客户端和服务器之间以request ...
- jquery ajax请求方式与提示用户正在处理请稍等,等待数据返回时loading的显示
1.jquery ajax请求方式与提示用户正在处理请稍等 为了提高用户体验度,我们通常会给出 “正在处理,请稍等!”诸如此类的提示.我们可通过设置$.ajax()下的参数beforeSend()来实 ...
- JQuery请求数据的方式
/*$.ajax常用的几个参数 // 1.url:要求为String类型的参数,(默认为当前页地址)发送请求的地址. // 2.type:要求为String类型的参数,请求方式(post或get)默认 ...
随机推荐
- lumen 响应宏
响应宏 laravel 中的响应宏,说明文档中有,lumen的没有找到.于是参考laravel 项目中的响应宏写了个Lumen的 1. 新建文件 App\Providers\ResponseMacro ...
- DP之背包
一.01背包: (以下均可用一维来写 即只能选择一次的物品装在一定容积的背包中.f[i][j]表示前i件物品在容积为j时的最大价值. for(int i = 1; i <= n ; i++){ ...
- APICloud项目纪要
一.页面之间的传递参数通过pageParam传递参数: api.openWin({ name: 'ware', url: './ware.html', pageParam: { wareId: 'w1 ...
- .net web mvc 权限验证
这里分享MVC的权限验证,内容中可能存在一些,莫名其妙的方法,那些是以前封装好的,大致可以根据方法名称知道他的意思. using Game.Entity; using Game.Entity.Plat ...
- 一个标准sql语句模板
select distinct top n * from t1 inner join t2 on ... join t3 on ... where ... group by ... having .. ...
- MySQL修炼之路二
1. 表字段的操作 1. 语法: alter table 表名 执行动作: 2. 添加字段(add) alter table 表名 add 字段名 数据类型: alter table 表名 add 字 ...
- lua使用ffi调用c程序的函数
参考: https://blog.csdn.net/weiwangchao_/article/details/16880401 http://luajit.org/ext_c_api.html h ...
- linux禁止root用户直接登录
允许root用户登录是很不安全的,但是有时候为了测试的方便, 也可以允许root用户登录,但是这个方法最好不要对公网开放使用. 1.新建一个用户,用来登录 test@cloud:~> usera ...
- postgres9.5.3升级postgres11.6
附上postgres下载地址: https://yum.postgresql.org/11/redhat/rhel-7-x86_64/repoview/postgresqldbserver11.gro ...
- Oracle存储过程常用语法及其使用
1.什么是存储过程 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行.它可以接受参数.输出参数,并可以返回单个或多个 ...