SmartSql 动态代理仓储
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 动态代理仓储的更多相关文章
- SmartSql 动态仓储
动态代理仓储 SmartSql源码:https://github.com/Ahoo-Wang/SmartSql 简介 动态代理仓储(SmartSql.DyRepository)组件是SmartSql非 ...
- JDK动态代理
一.基本概念 1.什么是代理? 在阐述JDK动态代理之前,我们很有必要先来弄明白代理的概念.代理这个词本身并不是计算机专用术语,它是生活中一个常用的概念.这里引用维基百科上的一句话对代理进行定义: A ...
- AOP之Castle DynamicProxy 动态代理
这里主要介绍使用castle这个动态代理,在.net一些开源的框架里可以找到它的影子,就连微软的rchard也是使用这个进行方法拦截等可以基于这个进行方法拦截,在这个方面PostSharp算是比较好用 ...
- java动态代理的2种实现方式
java的动态代理在接java的api上有说明,这里就不写了.我理解的代理: 对特定接口中特定方法的功能进行扩展,这就是代理.代理是通过代理实例关联的调用处理程序对象调用方法. 下面通过一个例子看一下 ...
- JDK动态代理实现原理
之前虽然会用JDK的动态代理,但是有些问题却一直没有搞明白.比如说:InvocationHandler的invoke方法是由谁来调用的,代理对象是怎么生成的.直到看了他的文章才彻底明白,附网址:htt ...
- java中动态代理的实现
动态代理的实现 使用的模式:代理模式. 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.类似租房的中介. 两种动态代理: (1)jdk动态代理,jdk动态代理是由Java内部的反射机制 ...
- 静态代理和利用反射形成的动态代理(JDK动态代理)
代理模式 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 静态代理 1.新建 ...
- Java动态代理
代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关 ...
- Java 动态代理机制详解
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
随机推荐
- BZOJ_1433_[ZJOI2009]假期的宿舍_二分图匹配
BZOJ_1433_[ZJOI2009]假期的宿舍_二分图匹配 题意: 学校放假了······有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题.比如A 和B都是学校的学生,A要回 ...
- NOIP2017 酱油送命记
Day0 一天,在机房,有点考前的紧张和慌张,打了一下午的模板,立了3个不该立的flag... Day1 拿到试题,万分紧张,T1是数论啊 害怕,一直以为D2T1才是数论,仔细观察却发现(flag1: ...
- enumerate取下标
for index,item in enumerate(product_list): # print(product_list.index(item),item) print(index,item) ...
- 对于zuul服务网关框架资料整理
本次博客只是整理了一些 看过的博客.源码等 zuul入门(1)zuul 的概念和原理 https://www.cnblogs.com/lexiaofei/p/7080257.html 深入理解Zuul ...
- Lucene 源码分析之倒排索引(二)
本文以及后面几篇文章将讲解如何定位 Lucene 中的倒排索引.内容很多,唯有静下心才能跟着思路遨游. 我们可以思考一下,哪个步骤与倒排索引有关,很容易想到检索文档一定是要查询倒排列表的,那么就从此处 ...
- Django文件上传(经典上传方式)
经典文件上传方式 创建URL from django.contrib import admin from django.urls import path from django.conf.urls i ...
- 微服务架构 - 搭建docker本地镜像仓库并提供权限校验及UI界面
搭建docker本地镜像仓库并提供权限校验及UI界面 docker本地镜像仓库的作用跟maven私服差不多,特别是公司级或者是小组级开发好的docker仓库可以上传到本地镜像仓库中,需要用时,直接从本 ...
- Docker 服务
1. Docker服务 作为一名后端攻城狮,对“服务”这个概念一定不陌生.比如,我们做一个会员系统,它可能会需要数据库.缓存.消息队列,这些都是中间件服务,除此以外可能还需要依赖其它的Dubbo服务 ...
- 100 天从 Python 新手到大师
Python应用领域和就业形势分析 简单的说,Python是一个“优雅”.“明确”.“简单”的编程语言. 学习曲线低,非专业人士也能上手 开源系统,拥有强大的生态圈 解释型语言,完美的平台可移植性 支 ...
- JS实现页面复制文字时自动加版权
经亲自实践,尝试了各种方法,目前可行的方法主要有如下两种: 可以在任何运行使用js代码的网站中使用,比如本人在自己的博客园博客中实现了一下,读者您可亲自在本人博客上测试. 方法1: <scrip ...