封装自己的dapper lambda扩展-设计篇(一)

简介: 封装自己的dapper lambda扩展-设计篇(一)

前言


昨天开源了业务业余时间自己封装的dapper lambda扩展,同时写了篇博文编写自己的dapper lambda扩展-使用篇简单的介绍了下其使用,今天将分享下它的设计思路


链式编程


其实就是将多个方法通过点(.)将它们串接起来,让代码更加简洁, 可读性更强。


new SqlConnection("").QuerySet<User>()
                      .Where(a => a.Name == "aasdasd")
                      .OrderBy(a => a.CreateTime)
             .Top(10)
                      .Select(a => a.Name).ToList();


 

其原理是类的调用方法的返回值类型为类本身或其基类,选择返回基类的原因是为了做

级约束,例如我希望使用了Top之后接着Select和ToList,无法再用where或orderBy。


UML图



image.png


原型代码


CommandSet


public class CommandSet<T> : IInsert<T>, ICommand<T>
    {
        #region 方法
        public int Insert(T entity)
        {
            throw new NotImplementedException();
        }
        public int Update(T entity)
        {
            throw new NotImplementedException();
        }
        public int Update(Expression<Func<T, T>> updateExpression)
        {
            throw new NotImplementedException();
        }
        public int Delete()
        {
            throw new NotImplementedException();
        }
        public IInsert<T> IfNotExists(Expression<Func<T, bool>> predicate)
        {
            throw new NotImplementedException();
        }
        public ICommand<T> Where(Expression<Func<T, bool>> predicate)
        {
            throw new NotImplementedException();
        }
        #endregion
    }
    public interface ICommand<T>
    {
        int Update(T entity);
        int Update(Expression<Func<T, T>> updateExpression);
        int Delete();
    }
    public interface IInsert<T>
    {
        int Insert(T entity);
    }
    public static class Database
    {
        public static QuerySet<T> QuerySet<T>(this SqlConnection sqlConnection)
        {
            return new QuerySet<T>();
        }
        public static CommandSet<T> CommandSet<T>(this SqlConnection sqlConnection)
        {
            return new CommandSet<T>();
        }
    }

 

QuerySet


 public class QuerySet<T> : IAggregation<T>
    {
        #region 方法
        public T Get()
        {
            throw new NotImplementedException();
        }
        public List<T> ToList()
        {
            throw new NotImplementedException();
        }
        public PageList<T> PageList(int pageIndex, int pageSize)
        {
            throw new NotImplementedException();
        }
        public List<T> UpdateSelect(Expression<Func<T, T>> @where)
        {
            throw new NotImplementedException();
        }
        public IQuery<TResult> Select<TResult>(Expression<Func<T, TResult>> selector)
        {
            throw new NotImplementedException();
        }
        public IOption<T> Top(int num)
        {
            throw new NotImplementedException();
        }
        public IOrder<T> OrderBy<TProperty>(Expression<Func<T, TProperty>> field)
        {
            throw new NotImplementedException();
        }
        public IOrder<T> OrderByDescing<TProperty>(Expression<Func<T, TProperty>> field)
        {
            throw new NotImplementedException();
        }
        public int Count()
        {
            throw new NotImplementedException();
        }
        public bool Exists()
        {
            throw new NotImplementedException();
        }
        public QuerySet<T> Where(Expression<Func<T, bool>> predicate)
        {
            throw new NotImplementedException();
        }
        #endregion
    }
    public interface IAggregation<T> : IOrder<T>
    {
        int Count();
        bool Exists();
    }
    public interface IOrder<T> : IOption<T>
    {
        IOrder<T> OrderBy<TProperty>(Expression<Func<T, TProperty>> field);
        IOrder<T> OrderByDescing<TProperty>(Expression<Func<T, TProperty>> field);
    }
    public interface IOption<T> : IQuery<T>, IUpdateSelect<T>
    {
        IQuery<TResult> Select<TResult>(Expression<Func<T, TResult>> selector);
        IOption<T> Top(int num);
    }
    public interface IUpdateSelect<T>
    {
        List<T> UpdateSelect(Expression<Func<T, T>> where);
    }
    public interface IQuery<T>
    {
        T Get();
        List<T> ToList();
        PageList<T> PageList(int pageIndex, int pageSize);
    }

 

以上为基本的设计模型,具体实现如有问题可以查看我的源码。


目录
相关文章
|
数据安全/隐私保护
FileInfo的重要属性和方法
FileInfo类提供与静态File类相同的功能,但是您可以通过手动编写用于从文件读取或写入字节的代码来对文件的读/写操作具有更多控制权。
|
API
.net core工具组件系列之Autofac—— 第二篇:Autofac的3种依赖注入方式(构造函数注入、属性注入和方法注入),以及在过滤器里面实现依赖注入
本篇文章接前一篇,建议可以先看前篇文章,再看本文,会有更好的效果。前一篇跳转链接:https://www.cnblogs.com/weskynet/p/15046999.html
1026 0
.net core工具组件系列之Autofac—— 第二篇:Autofac的3种依赖注入方式(构造函数注入、属性注入和方法注入),以及在过滤器里面实现依赖注入
|
设计模式 缓存
二十三种设计模式全面解析-代理模式(Proxy Pattern)详解:探索隐藏于背后的力量
二十三种设计模式全面解析-代理模式(Proxy Pattern)详解:探索隐藏于背后的力量
774 1
|
网络协议 Windows
Windows Server 各版本搭建 DNS 服务器实现域名正反向解析
Windows Server 各版本搭建 DNS 服务器实现域名正反向解析
|
SQL 开发框架 .NET
常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结
常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结
3552 0
|
JavaScript 前端开发 数据安全/隐私保护
【好用】推荐10套后端管理系统前端模板
选择合适的模板可以大大提高开发效率,减少重复劳动,让开发者能够专注于业务逻辑的实现和功能的优化。开发者应根据项目的具体需求、团队的技术栈熟悉度以及产品的长远规划来选择最合适的模板,问题来了,这10款模板你更喜欢用哪个呢,欢迎交流。
1215 0
|
Java 微服务 Spring
了解Sidecar模式
本文介绍Sidecar模式的特点,及其应用的场景。熟悉Native Cloud或者微服务的童鞋应该知道,在云环境下,技术栈可以是多种多样的。那么如何能够将这些异构的服务组件串联起来,成为了服务治理的一个重大课题。
5313 0
|
存储 缓存 JSON
Nacos配置中心:优化微服务架构的配置管理利器
Nacos配置中心:优化微服务架构的配置管理利器
611 0
|
安全 fastjson Java
Unchecked cast: java.lang.Object to java.util.List问题的解决
Unchecked cast: java.lang.Object to java.util.List问题的解决
2303 0
Unchecked cast: java.lang.Object to java.util.List问题的解决