SmartSql 动态代理仓储,一个高生产力的组件。该组件看似很难懂,实际上仅做了映射Statement,转发请求的功能。但却意义重大。

SmartSql提供了一个通用泛型仓储接口

SmartSql.DyRepository.IRepository<TEntity, TPrimary>

    public interface IRepository<TEntity, TPrimary> : IRepository
{
int Insert(TEntity entity);
int Delete(object reqParams);
[Statement(Id = "Delete")]
int DeleteById([Param("Id")]TPrimary id);
int Update(TEntity entity);
[Statement(Id = "Update")]
int DyUpdate(object dyObj);
IEnumerable<TEntity> Query(object reqParams);
IEnumerable<TEntity> QueryByPage(object reqParams);
[Statement(Execute = ExecuteBehavior.ExecuteScalar)]
int GetRecord(object reqParams);
TEntity GetEntity(object reqParams);
[Statement(Id = "GetEntity")]
TEntity GetById([Param("Id")]TPrimary id);
[Statement(Execute = ExecuteBehavior.ExecuteScalar)]
bool IsExist(object reqParams);
}

定义仓储接口

    /// <summary>
/// 属性可选: [SqlMap(Scope = "User")] ,不设置 则默认 Scope 模板:I{Scope}Repository
/// 可传入自定义模板
/// RepositoryBuilder builder=new RepositoryBuilder("I{Scope}DAL");
/// </summary>
public interface IUserRepository : IRepository<User, string>
{
/// <summary>
/// 属性可选 [Statement(Execute = ExecuteBehavior.Auto,Id = "Query")]
/// 默认 Execute:Auto ,自动判断 执行类型
/// 默认 Id : 方法名
/// </summary>
/// <param name="reqParams"></param>
/// <returns></returns>
[Statement(Sql = "Select Top(@taken) T.* From User T With(NoLock);")]
IEnumerable<User> QueryBySql(int taken);
}

注入依赖

注入依赖后将动态实现仓储接口,并映射好相应SqlMap

    services.AddSmartSql();
services.AddRepositoryFactory();
services.AddRepositoryFromAssembly((options) =>
{
options.AssemblyString = "SmartSql.Starter.Repository";
});

Attribute

仓储接口,函数特性(StatementAttribute)

    public class StatementAttribute : Attribute
{
/// <summary>
/// 定义 SmartSqlMap.Scope 该属性可选,默认使用仓储接口的Scope
/// </summary>
public string Scope { get; set; }
/// <summary>
/// 可选,默认使用函数名作为 Statement.Id
/// </summary>
public string Id { get; set; }
/// <summary>
/// 可选, 默认 Execute:Auto ,自动判断 执行类型
/// </summary>
public ExecuteBehavior Execute { get; set; } = ExecuteBehavior.Auto;
/// <summary>
/// 可选,当不使用 SmartSqlMap.Statement 时可直接定义 Sql
/// </summary>
public string Sql { get; set; }
}
    /// <summary>
/// 执行行为
/// </summary>
public enum ExecuteBehavior
{
/// <summary>
/// 自动判断执行类型
/// </summary>
Auto = 0,
/// <summary>
/// 返回受影响行数
/// </summary>
Execute = 1,
/// <summary>
/// 返回结果的第一行第一列的值,主要用于返回主键
/// </summary>
ExecuteScalar = 2,
/// <summary>
/// 查询枚举对象,List
/// </summary>
Query = 3,
/// <summary>
/// 查询单个对象
/// </summary>
QuerySingle = 4,
/// <summary>
/// 返回DataTable
/// </summary>
GetDataTable = 5,
/// <summary>
/// 返回DataSet
/// </summary>
GetDataSet = 6
}

仓储接口特性(SqlMapAttribute)

    public class SqlMapAttribute : Attribute
{
/// <summary>
/// SmartSqlMapConfig.Scope 映射
/// </summary>
public string Scope { get; set; }
}

函数参数特性(ParamAttribute)

    public class ParamAttribute : Attribute
{
public ParamAttribute(string name = "")
{
Name = name;
}
/// <summary>
/// DbDataParameter.Name
/// </summary>
public String Name { get; set; }

SmartSql 动态代理仓储的更多相关文章

  1. SmartSql 动态仓储

    动态代理仓储 SmartSql源码:https://github.com/Ahoo-Wang/SmartSql 简介 动态代理仓储(SmartSql.DyRepository)组件是SmartSql非 ...

  2. JDK动态代理

    一.基本概念 1.什么是代理? 在阐述JDK动态代理之前,我们很有必要先来弄明白代理的概念.代理这个词本身并不是计算机专用术语,它是生活中一个常用的概念.这里引用维基百科上的一句话对代理进行定义: A ...

  3. AOP之Castle DynamicProxy 动态代理

    这里主要介绍使用castle这个动态代理,在.net一些开源的框架里可以找到它的影子,就连微软的rchard也是使用这个进行方法拦截等可以基于这个进行方法拦截,在这个方面PostSharp算是比较好用 ...

  4. java动态代理的2种实现方式

    java的动态代理在接java的api上有说明,这里就不写了.我理解的代理: 对特定接口中特定方法的功能进行扩展,这就是代理.代理是通过代理实例关联的调用处理程序对象调用方法. 下面通过一个例子看一下 ...

  5. JDK动态代理实现原理

    之前虽然会用JDK的动态代理,但是有些问题却一直没有搞明白.比如说:InvocationHandler的invoke方法是由谁来调用的,代理对象是怎么生成的.直到看了他的文章才彻底明白,附网址:htt ...

  6. java中动态代理的实现

    动态代理的实现 使用的模式:代理模式. 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.类似租房的中介. 两种动态代理: (1)jdk动态代理,jdk动态代理是由Java内部的反射机制 ...

  7. 静态代理和利用反射形成的动态代理(JDK动态代理)

    代理模式 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 静态代理 1.新建 ...

  8. Java动态代理

    代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关 ...

  9. Java 动态代理机制详解

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...

随机推荐

  1. bzoj 2763 [JLOI2011]飞行路线 Dijikstra 分层

    k<=10,所以每用一次机会就跳到一个新图中, 每一个图按原图建边,相邻两图中建边权为0的边 补一补dj,好像我以前觉得dj特别难,hhhhh #include<cstdio> #i ...

  2. ELK---日志分析系统

    ELK就是一套完整的日志分析系统 ELK=Logstash+Elasticsearch+Kibana 统一官网https://www.elastic.co/products ELK模块说明 Logst ...

  3. eclipse使用Git基本流程

    1.安装GIT 2.Git的使用 ①下载代码到eclipse(右键导入工程) ②提交代码到本地(commit) ③更新代码到本地(pull) ④当本地出现冲突时,解决冲突,没有冲突当然就最好啦 ⑤提交 ...

  4. 神奇的Scala Macro之旅(四)- BeanBuilder

    在Java开发中,经常会有一个需求,将一个 Bean 复制到另外一个 Bean,尤其是在后台分层的场景下,在不同的层之间传递信息,经常需要进行 这样的一个对象复制工作,类似于: val source: ...

  5. MIUI目前为止最简单安装谷歌服务框架教程

    安装谷歌服务框架方法有很多,比如用第三方 rec卡刷gapps包.用第三方工具安装......然而这些对于新手来说还是比较难的! 我今天说的方法可以说是最简单的:1.不需要修改文件:2.不需要借助第三 ...

  6. NIO(生活篇)

    今晚是个下雨天,写完今天最后一行代码,小鲁班起身合上电脑,用滚烫的开水为自己泡制了一桶老坛酸菜牛肉面.这大概是苦逼程序猿给接下来继续奋战的自己最好的馈赠.年轻的程序猿更偏爱坐在窗前,在夜晚中静静的享受 ...

  7. javascript-发布订阅模式与观察者模式

    设计模式"(Design Pattern)是针对编程中经常出现的.具有共性的问题,所提出的解决方法.著名的<设计模式>一书一共提出了23种模式. 发布订阅模式 它定义了一种对象间 ...

  8. sun.misc jar包

    一直以来Base64算法的加密解密都是使用sun.misc包下的BASE64Encoder及BASE64Decoder来进行的.但是这个类是sun公司的内部方法,并没有在Java API中公开过,不属 ...

  9. 18 章 CSS 链接、光标、 DHTML 、缩放

    1.CSS 中链接的使用 2.CSS 中光标的使用 3.CSS 中 DHTML 的使用 4.CSS 中缩放的使用 1 18 8. .1 1 S CSS  中 链接的使用 超链接伪类属性 a:link ...

  10. 阿里云ECS云服务器的简单使用

    随着云服务的推广与普及,越来越多的人开始接触到云服务器.然而有些人购买后却不知从何下手,今天就来看下阿里云服务器的使用吧! 一.购买完阿里云服务器后进入阿里云官网首页点击控制台 找到所购买的云产品项点 ...