dapper实现的简单架构

1.首先建立空白的解决方案,然后分别创建TestData.Business(业务逻辑类类库)引入Dapper和DapperExtensions两个类库,可以再网上下载下。TestData.Common(工具类类库)TestData.Entity(实体类类库)TestData.Filter(查询条件类库)TextData.Web(web应用程序)

在TextData.Web中引入mvc的架构和easyui最终情况如图所示:

2.创建数据库中的实体,并创建公用的实体接口:IDataEntity  它里面放着每个实体中都存在的属性比如:主键、修改人、修改时间等

实体类生成小技巧:用ef生成codefirst然后删除他的映射文件和appconfig然后所有的类继承IDataEntity接口即可。

在实体类中添加mapping文件夹,写入基类CustomMapping代码如下:

using DapperExtensions.Mapper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestData.Entity.Mapping
{
    public class CustomMapping<T> : ClassMapper<T> where T : class,IDataEntity
    {
        public CustomMapping()
        {
            Map(x => x.Id).ReadOnly();
        }
    }
}

注:mapping的作用(过滤不想读取的字段或设置一些字段在数据库中的含义)

      在继承CustomMapping的时候除了要写一些字段的过滤意外在最后一定要写上AutoMap();他的作用是提交所有的字段

3.在TestData.Filter中添加查询条件的基类,因为用到了easyui他的表格要接收的东西包含rows、total、所以封装了一个基类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestData.Filter
{
    /// <summary>
    /// 搜索条件的基类包含了页数 行数  派讯
    /// </summary>
    public class BaseFilter
    {
        private int _page = 1;
        public int page
        {
            set
            {
                _page = value;
            }
            get
            {
                return _page;
            }
        }

        public int _rows = 10;

        public int rows
        {
            set { _rows = value; }
            get { return _rows; }
        }

        private string _sortName = "EditorDate";

        public string sort
        {
            get { return _sortName; }
            set { _sortName = value; }
        }
    }
}

只要在为每个实体写搜索条件的时候继承这个类就好咯

4.封装业务逻辑

      1)添加链接对象工厂

   

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestData.Business
{
    public class ConnectionFactory
    {
        private static readonly string ConnString =
            ConfigurationManager.ConnectionStrings["ShopEntity"].ConnectionString;


        private static object _obj = new object();

        public static SqlConnection Connection
        {
            get
            {
                SqlConnection connection = null;

                if (connection == null)
                {
                    lock (_obj)
                    {
                        if (connection == null)
                        {
                            connection = new SqlConnection(ConnString);
                        }
                    }
                }
                return connection;
            }
        }
    }
}

   2)编写业务逻辑的基类

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Net.Cache;
using System.Text;
using Dapper;
using DapperExtensions;
using TestData.Entity;
using TestData.Business;

namespace TestData.Business
{
    /// <summary>
    /// 业务逻辑的基类  包含了一些简单的操作
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public abstract class BaseManager<T> where T : class, IDataEntity
    {
        /// <summary>
        /// 查询所有
        /// </summary>
        /// <returns></returns>
        public IEnumerable<T> GetAll()
        {
            using (var conn = ConnectionFactory.Connection)
            {
                return conn.GetList<T>();
            }
        }

        /// <summary>
        /// 根绝sql查询
        /// </summary>
        /// <param name="sql">sql</param>
        /// <param name="parameters">参数列表</param>
        /// <returns></returns>
        public IEnumerable<T> SelectCommond(string sql, object parameters = null)
        {
            using (var conn = ConnectionFactory.Connection)
            {
                return conn.Query<T>(sql, parameters);
            }
        }
        /// <summary>
        /// 根据表明查询
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public IEnumerable<T> GetAll(string name)
        {
            using (var conn = ConnectionFactory.Connection)
            {
                return conn.Query<T>(string.Format("select * from {0}", name));
            }
        }
        /// <summary>
        /// 根据编号查询
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public T GetById(int? id)
        {
            if (id == null)
                return default(T);
            using (var conn = ConnectionFactory.Connection)
            {

                return conn.Get<T>(id.Value);
            }
        }
        /// <summary>
        /// 修改实体
        /// </summary>
        /// <param name="t">实体对象</param>
        /// <returns></returns>
        public bool Update(T t)
        {
            using (var conn = ConnectionFactory.Connection)
            {
                t.EditorDate = DateTime.Now;
                return conn.Update(t);
            }
        }

        /// <summary>
        /// 得到数量
        /// </summary>
        /// <returns></returns>
        public int GetCount()
        {
            using (var conn = ConnectionFactory.Connection)
            {
                return conn.Count<T>(null);
            }
        }

        /// <summary>
        /// 分页
        /// </summary>
        /// <param name="predicate"></param>
        /// <param name="pageindex"></param>
        /// <param name="pageSize"></param>
        /// <returns></returns>
        public Tuple<int, IEnumerable<T>> GetPaged(object predicate, int pageindex, int pageSize)
        {
            using (var conn = ConnectionFactory.Connection)
            {
                var sort = new List<ISort>
                    {
                        Predicates.Sort<T>(p=>p.EditorDate)
                    };

                var total = conn.Count<T>(predicate);
                return new Tuple<int, IEnumerable<T>>(total, conn.GetPage<T>(predicate, sort, pageindex, pageSize).ToList());
            }
        }
        /// <summary>
        /// 添加
        /// </summary>
        /// <param name="t">实体对象</param>
        /// <returns></returns>
        public bool Insert(T t)
        {
            t.EditorDate = DateTime.Now;
            return this.Add(t, false) == t.Id;
        }
        /// <summary>
        /// 添加实体集合
        /// </summary>
        /// <param name="list"></param>
        /// <returns></returns>
        public bool Insert(List<T> list)
        {
            using (var conn = ConnectionFactory.Connection)
            {
                list.ForEach(p => p.EditorDate = DateTime.Now);
                return conn.Insert(list);
            }
        }


        /// <summary>
        /// 添加实体
        /// </summary>
        /// <param name="t">实体对象</param>
        /// <param name="isAutoGenId"></param>
        /// <returns></returns>
        public int Add(T t, bool isAutoGenId = true)
        {
            using (var conn = ConnectionFactory.Connection)
            {
                //var maxindex = conn.Query<int?>(string.Format("select max(indexs) from {0}", typeof(T).Name)).FirstOrDefault() ?? 0;
                //t.Indexs = maxindex + 1;
                return conn.Insert(t, isGenId: isAutoGenId);
            }
        }
        /// <summary>
        /// 根据编号删除
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public bool Delete(int? id)
        {
            var obj = this.GetById(id);
            if (obj == null) return false;
            return this.Update(obj);
        }
        /// <summary>
        /// 根据编号修改
        /// </summary>
        /// <param name="id"></param>
        /// <param name="mark"></param>
        /// <returns></returns>
        public bool UpdataStatus(int? id)
        {
            var obj = this.GetById(id);
            if (obj == null) return false;
            return this.Update(obj);
        }
        /// <summary>
        /// 根据外键得到数据
        /// </summary>
        /// <param name="foreignKeyName">外键名称</param>
        /// <param name="foreignKeyValue">外键的值</param>
        /// <returns></returns>
        public IEnumerable<T> GetByForeignKey(string foreignKeyName, Guid foreignKeyValue)
        {
            using (var conn = ConnectionFactory.Connection)
            {
                return conn.Query<T>(string.Format("select * from {0} where {1}=@value", typeof(T).Name, foreignKeyName), new { value = foreignKeyValue });
            }
        }
        /// <summary>
        /// 根据列查询
        /// </summary>
        /// <param name="fieldName">列名称</param>
        /// <param name="fieldValue">列的值</param>
        /// <returns></returns>
        public IEnumerable<T> GetByField(string fieldName, dynamic fieldValue)
        {
            using (var conn = ConnectionFactory.Connection)
            {
                return conn.Query<T>(string.Format("select * from {0} where {1}=@value", typeof(T).Name, fieldName), new { value = fieldValue });
            }
        }
        /// <summary>
        /// lxh 根据某列查询的方法--带排序
        /// </summary>
        /// <param name="fieldName">查询列名</param>
        /// <param name="fieldValue">条件内容</param>
        /// <param name="sortFieldName">排序列名</param>
        /// <returns></returns>
        public IEnumerable<T> GetByField(string fieldName, dynamic fieldValue, string sortFieldName)
        {
            using (var conn = ConnectionFactory.Connection)
            {
                return conn.Query<T>(string.Format("select * from {0} where {1}=@value order by {2}", typeof(T).Name, fieldName, sortFieldName), new { value = fieldValue });
            }
        }

        /// <summary>
        /// lxh 获取排序号的方法
        /// </summary>
        /// <returns></returns>
        public int GetNextSequence(T t)
        {
            using (var conn = ConnectionFactory.Connection)
            {
                return conn.Query<int>(string.Format("select isnull(max(Sequence),0)+1 from {0}", typeof(T).Name)).FirstOrDefault();
            }
        }
        /// <summary>
        /// 存储过程
        /// </summary>
        /// <param name="procName"></param>
        /// <param name="obj"></param>
        /// <returns></returns>
        public List<dynamic> SelectProc(string procName, object obj = null)
        {
            using (var conn = ConnectionFactory.Connection)
            {
                return conn.Query(procName, obj, commandType: CommandType.StoredProcedure).ToList();
            }
        }
    }
}

     3)编写一些特殊的方法、为特殊的sql所使用

using DapperExtensions;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using TestData.Entity;
using TestData.Filter;
using Dapper;
namespace TestData.Business
{
    public static class DataExtensions
    {

        public static bool ExecuteTransaction(this SqlConnection conn, Action<SqlConnection, SqlTransaction> action)
        {
            var transaction = conn.BeginTransaction();
            try
            {
                action(conn, transaction);
                transaction.Commit();
                return true;
            }
            catch (Exception)
            {
                transaction.Rollback();
                return false;
            }
        }

        public static PredicateGroup GetPredicate<T>(this BaseFilter filter, int? id = 0) where T : class ,IDataEntity
        {
            var predicate = new PredicateGroup
            {
                Operator = GroupOperator.And,
                Predicates = new List<IPredicate>()
            };

            if (id != 0)
                predicate.Predicates.Add(Predicates.Field<T>(p => p.Id, Operator.Eq, Convert.ToInt32(id)));

            return predicate;
        }

        public static List<ISort> GetSorts<T>(this BaseFilter filter) where T : class
        {

            var expressionparam = Expression.Parameter(typeof(T), "p");
            var bodyExp = Expression.Convert(Expression.Property(expressionparam, filter.sort), typeof(Object));
            var expression = Expression.Lambda<Func<T, object>>(bodyExp, expressionparam);

            return new List<ISort>
                    {
                        Predicates.Sort(expression)
                    };
        }

        public static int Total<T>(this IEnumerable<T> list) where T : class,IDataEntity
        {
            using (var conn = ConnectionFactory.Connection)
            {
                return conn.Count<T>(Predicates.Field<T>(p => p.Id, Operator.Eq, null));
            }
        }

        public static int Total<T>(object predicate) where T : class
        {
            using (var conn = ConnectionFactory.Connection)
            {
                return conn.Count<T>(predicate);
            }
        }

        public static IDataEntity GetSingle(IDataEntity entity)
        {
            using (var conn = ConnectionFactory.Connection)
            {
                return
                    conn.Query<IDataEntity>(string.Format("select * from {0} where id=@ii", entity.GetType().Name), new { ii = entity.Id }).FirstOrDefault();
            }
        }

        public static PageList<T> ToPageList<T>(this IEnumerable<T> iEnumerable, object predicate) where T : class
        {
            return new PageList<T>
            {
                DataList = iEnumerable.ToList(),
                Total = Total<T>(predicate)
            };
        }
    }

    public class PageList<T>
    {
        public List<T> DataList { set; get; }

        public int Total { set; get; }

    }

}

好啦这样一个简单的架构就实现啦!!!

 

posted @ 2015-01-13 10:44  流浪的狸猫  阅读(7702)  评论(13编辑  收藏  举报