营销平台数据请求介绍

项目介绍:

前端使用 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# 数据请求方式提供的更多相关文章

  1. Layui数据表格的接口数据请求方式为Get

    Layui数据表格的接口数据请求方式为Get

  2. axios的数据请求方式及跨域

    express 的三大功能:静态资源.路由.模板引擎 app.use(express.static('www')); 只要是创建这个静态的目录,这个 www 的静态目录里面的文件就可以被访问 数据的请 ...

  3. android post带数据请求方式,传递的数据格式包括json和map

    如下: public static String httpPost(String url, String json) { try { URL u = new URL(url); HttpURLConn ...

  4. Android为TV端助力 post带数据请求方式,传递的数据格式包括json和map

    如下: public static String httpPost(String url, String json) { try { URL u = new URL(url); HttpURLConn ...

  5. Iris请求方式和数据返回类型

    1. Iris起服务 package main import "github.com/kataras/iris" func main() { //1.创建app结构体对象 app ...

  6. jquery提供的数据提交方式2-ajax

    以前介绍过ajax提交方式.但仅仅是个例子,今天将详细介绍jquery中的$.ajax,$.get,$.post方法. 一,首先介绍$.ajax方法参数(以下参数来自:http://www.cnblo ...

  7. HTTP 请求方式: GET和POST的比较当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。

    什么是HTTP? 超文本传输协议(HyperText Transfer Protocol -- HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议. HTTP在客户端和服务器之间以request ...

  8. jquery ajax请求方式与提示用户正在处理请稍等,等待数据返回时loading的显示

    1.jquery ajax请求方式与提示用户正在处理请稍等 为了提高用户体验度,我们通常会给出 “正在处理,请稍等!”诸如此类的提示.我们可通过设置$.ajax()下的参数beforeSend()来实 ...

  9. JQuery请求数据的方式

    /*$.ajax常用的几个参数 // 1.url:要求为String类型的参数,(默认为当前页地址)发送请求的地址. // 2.type:要求为String类型的参数,请求方式(post或get)默认 ...

随机推荐

  1. lumen 响应宏

    响应宏 laravel 中的响应宏,说明文档中有,lumen的没有找到.于是参考laravel 项目中的响应宏写了个Lumen的 1. 新建文件 App\Providers\ResponseMacro ...

  2. DP之背包

    一.01背包: (以下均可用一维来写 即只能选择一次的物品装在一定容积的背包中.f[i][j]表示前i件物品在容积为j时的最大价值. for(int i = 1; i <= n ;  i++){ ...

  3. APICloud项目纪要

    一.页面之间的传递参数通过pageParam传递参数: api.openWin({ name: 'ware', url: './ware.html', pageParam: { wareId: 'w1 ...

  4. .net web mvc 权限验证

    这里分享MVC的权限验证,内容中可能存在一些,莫名其妙的方法,那些是以前封装好的,大致可以根据方法名称知道他的意思. using Game.Entity; using Game.Entity.Plat ...

  5. 一个标准sql语句模板

    select distinct top n * from t1 inner join t2 on ... join t3 on ... where ... group by ... having .. ...

  6. MySQL修炼之路二

    1. 表字段的操作 1. 语法: alter table 表名 执行动作: 2. 添加字段(add) alter table 表名 add 字段名 数据类型: alter table 表名 add 字 ...

  7. lua使用ffi调用c程序的函数

    参考: https://blog.csdn.net/weiwangchao_/article/details/16880401   http://luajit.org/ext_c_api.html h ...

  8. linux禁止root用户直接登录

    允许root用户登录是很不安全的,但是有时候为了测试的方便, 也可以允许root用户登录,但是这个方法最好不要对公网开放使用. 1.新建一个用户,用来登录 test@cloud:~> usera ...

  9. postgres9.5.3升级postgres11.6

    附上postgres下载地址: https://yum.postgresql.org/11/redhat/rhel-7-x86_64/repoview/postgresqldbserver11.gro ...

  10. Oracle存储过程常用语法及其使用

    1.什么是存储过程 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行.它可以接受参数.输出参数,并可以返回单个或多个 ...