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. 【bzoj3598】: [Scoi2014]方伯伯的商场之旅

    Description 方伯伯有一天去参加一个商场举办的游戏.商场派了一些工作人员排成一行.每个人面前有几堆石子.说来也巧,位置在 i 的人面前的第 j 堆的石子的数量,刚好是 i 写成 K 进制后的 ...

  2. bzoj4476 [Jsoi2015]送礼物

    化简式子 $M>=m+ans*(r-l+k)$ 发现$M,m$确定时,总区间长度越小越好,于是假定右端点为最小值$M+ans*l>=m+ans*r+ans*k$, 右面都确定了,但最大值仍 ...

  3. STL--multiset用法

    multiset: multiset<int>s; 定义正向迭代器与正向遍历: multiset<int>::iterator it; for(it=s.begin();it! ...

  4. java可用与串口通信的一些库

    java原生对串口的支持只有javax.comm,javax.comm比较老了,而且不支持64位系统,我在看jlibmodbus(一个java实现的modbus协议栈)的时候发现了几个可供使用的jav ...

  5. centos7 启动docker失败的解决

    控制端使用yum install docker安装完成docker后启动docker失败,出现以下信息: Job for docker.service failed because the contr ...

  6. 我是庖丁,<肢解IOT平台>之物模型

    前言 物模型是对设备在云端的功能描述,包括设备的属性,数据,服务和事件. 物联网平台通过定义一种物的描述语言来描述物模型,称之为 TSL(即 Thing Specification Language) ...

  7. img 灰色默认外边框的去除

    最近在做一个小游戏时发现了一个问题,总是在弹出img时先出现一个灰色的边框,所以为了查找问题,查找了一些关于img 默认边框的小知识点. 在这里整理了一些知识点: 一. 下面代码都试验过后会发现,im ...

  8. .net core 并发下的线程安全问题

    抱歉,其实内容并不如题!!!真正的题目应该为<.net core 并发下由于注入模式引起的线程安全问题> 背景(写测试demo所出现的异常,供大家学习与拍砖): .net core web ...

  9. 基于Win10极简SonarQube C#代码质量分析

    博客有些好些时间未更新了,这几个月的时间里,离开了实习的公司.大学毕了业.来了新公司.转了户口,有点忙,最近总算稍微闲下来了,打算重新拾起博客,坚持写下去. 言归正转,什么是SonarQube ? S ...

  10. windows,分割路径.得出目录

    #include <windows.h> #include <vector> #include <stdio.h> #include <string> ...