营销平台数据请求介绍

项目介绍:

前端使用 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. 浅析负载均衡的6种算法,Ngnix的5种算法

    常见的几种负载均衡算法 1.轮询法 将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载. 2.随机法 通过系统的随机算法,根据后端服务器的 ...

  2. 【转载】 C#中ArrayList使用ToArray方法转换为数组

    在C#的编程开发中,ArrayList集合是一个常用的非泛型类集合,可以使用ArrayList中的ToArray方法将ArrayList集合对象转换为数组,ToArray方法有2个重载形式,其一为vi ...

  3. 字符串替换replace方法

    字符串替换replace方法: http://www.w3school.com.cn/jsref/jsref_replace.asp http://www.cnblogs.com/skywang/ar ...

  4. js数组去重 数组拼接 替换数组中的指定值 递归数组 判断数组中是否存在指定值 数组求和 根据条件判数组值

    这是学习过程中记录的一些关于数组操作的常用属性或方法,记录一下方便以后使用. // 数组去重 var arr1 = [1,1,2,3,4,5,6,3,2,4,5,'a','b','c','a',6,7 ...

  5. javascript 函数表达和闭包

    函数表达式和闭包 针对JS高级程序设计这本书,主要是理解概念,大部分要点源自书内.写这个主要是当个笔记加总结 存在的问题请大家多多指正! 定义函数的两种方法 函数声明: function functi ...

  6. 维护中常用的k8s和docker命令

    kubernet命令 查看所有pod的信息: kubectl get pod --all-namespaces -o wide 查看命名为kube-system的pod kubectl get pod ...

  7. OpenSSL 安装 (Linux系统)

    OpenSSL 编译安装 操作系统:CentOS 7 OpenSSL Version: openssl-1.1.1d.tar.gz OpenSSL下载地址为:https://www.openssl.o ...

  8. SpringBoot整合JavaWeb

    一.SpringBoot整合Servlet的两种方式 1.通过注解扫描完成Servlet组件的注册 编写Servlet package com.example.demo.servlet; import ...

  9. django中运行定时任务脚本

    需要使用到django_apscheduler模块,因此先安装: pip install django-apscheduler 然后在工程的settings.py文件中的INSTALLED_APPS模 ...

  10. LCD裸板编程_框架

    lcd程序框架: 为了让程序更好的扩展,介绍面向对象编程: 比如抽象出lcd_3.5和lcd_4.3的共同点: 当我想使用3.5寸的lcd时,只需让lo指向lcd_3.5_opr即可.同样,当我想使用 ...