封装自己的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);
    }

 

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


目录
相关文章
|
8月前
|
安全 Java 数据安全/隐私保护
|
SQL 关系型数据库 Go
Go语言微服务框架 - 12.ORM层的自动抽象与自定义方法的扩展
随着接口参数校验功能的完善,我们能快速定位到接口层面的参数问题;而应用服务的分层代码,也可以通过log的trace-id发现常见的业务逻辑问题。 但在最底层与数据库的操作,也就是对GORM的使用,经常会因为我们不了解ORM的一些细节,导致对数据的CRUD失败,或者没有达到预期效果。这时,我们希望能在ORM这一层也有一个通用的解决方案,来加速问题的排查。
94 0
|
28天前
|
敏捷开发
封装的优势
封装是面向对象编程的三大特性之一,通过隐藏对象的内部状态和实现细节,仅通过对象提供的方法进行交互。封装提高了代码的可读性、可维护性和安全性,降低了代码的复杂性。在敏捷开发和团队合作中,封装促进了快速迭代和分工合作,提高了开发效率。
42 0
|
8月前
|
设计模式
二十三种设计模式全面解析-组合模式与迭代器模式的结合应用:构建灵活可扩展的对象结构
二十三种设计模式全面解析-组合模式与迭代器模式的结合应用:构建灵活可扩展的对象结构
133 0
|
5月前
|
设计模式
建模底层逻辑问题之以命令设计模式为例,要用定义法建模,如何实现
建模底层逻辑问题之以命令设计模式为例,要用定义法建模,如何实现
|
8月前
|
Unix Linux 测试技术
C++封装详解——从原理到实践
C++封装详解——从原理到实践
388 0
|
存储 自然语言处理 算法
GaiaX开源解读 | 表达式作为逻辑动态化的基础,我们是如何设计的
GaiaX跨端模板引擎,是在阿里优酷、淘票票、大麦内广泛使用的Native动态化方案,其核心优势是性能、稳定和易用。本系列文章《GaiaX开源解读》,带大家看看过去三年GaiaX的发展过程。
379 0
|
存储 自然语言处理 算法
作为逻辑动态化的基础,GaiaX 表达式是如何设计的? | GaiaX 开源解读
GaiaX 跨端模板引擎,是在阿里文娱内广泛使用的 Native 动态化方案,其核心优势是性能、稳定和易用。本系列文章《GaiaX 开源解读》,带大家看看过去三年 GaiaX 的发展过程。 GaiaX 开源地址:https://github.com/alibaba/GaiaX
443 0
作为逻辑动态化的基础,GaiaX 表达式是如何设计的? | GaiaX 开源解读
|
程序员 数据安全/隐私保护 C++
C++面向对象封装特性的实例分析与应用扩展(一)
生活中充满复杂性,处理复杂性的方法之一就是简化和抽象。在计算中,为了根据信息与用户之间的接口来表示它,抽象是至关重要的。将问题的本质特征抽象出来,并根据特征来描述解决方案。抽象往往是用户定义类型的捷径,在C++中用户定义类型指的就是实现抽象接口的类设计。
137 1
C++面向对象封装特性的实例分析与应用扩展(一)
|
编译器 C语言 C++
C++面向对象封装特性的实例分析与应用扩展(二)
封装意义一: 在设计类的时候,属性和行为写在一起,表现事物 语法: class 类名{ 访问权限: 属性 / 行为 }; 示例1:设计一个圆类,求圆的周长
155 0
C++面向对象封装特性的实例分析与应用扩展(二)

热门文章

最新文章