SmartSql 动态代理仓储

SmartSql源码:https://github.com/Ahoo-Wang/SmartSql

1|1简介



动态代理仓储(SmartSql.DyRepository)组件是SmartSql非常独特的功能,它能简化SmartSql的使用。对业务代码除了配置几乎没有侵入。可以说使用SmartSqlContainer是原始方法,而DyRepository自动帮你实现这些方法。

DyRepository的表现是只需要定义仓储接口,通过简单配置就能自动实现这些接口并注册到IoC容器中,使用时注入即刻获取实现。原理是通过接口和接口方法的命名规则来获取SmartSql的xml文件中的Scope和SqlId,用接口方法的参数作为Request,通过xml中的sql自动判断是查询还是执行操作,最后实现对ISmartSqlMapper的调用。

1|2适合场景



  1. 使用了仓储模式的架构

仓储模式主要在DDD战术中运用,用来隔离领域和数据库。DyRepository的功能需求主要是在DDD的实践中发现的,目前为止已经满足DDD实践的大部分需求,如果还有其他的相关需求欢迎提出Issue。

  1. 类似SqlHepler的应用

DyRepository可以将任意一个接口实现出查询数据库的工具,CURD方法不在话下。通过接口注入更能发挥解耦的作用。

1|3使用介绍



下面会简单演示DyRepository与ISmartSqlMapper的使用对比。

准备工作

  1. 先创建一个仓储,这个仓储不依赖SmartSql,只是普普通通的仓储接口

640?wx_fmt=png

  1. 创建配置xml文件SmartSqlMapConfig.xml:

640?wx_fmt=png

  1. 再创建xml配置文件Activity.xml,放到Maps目录,并且在属性面板设置为“始终复制”:

640?wx_fmt=png

准备工作完成,下面就可以展示两种用法的区别。

两种用法

ISmartSqlMapper 用法

如果不用DyRepository,我们需要用ISmartSqlMapper实现这个仓储。

640?wx_fmt=png

再把实现类注册到IoC中:Dp

640?wx_fmt=pngy

如果使用DyRepository,我们只需配置一下IoC注册即可。

640?wx_fmt=png

注入使用

使用方法就注入接口,再调用接口方法了。

640?wx_fmt=png

1|4总结



通过DyRepository与ISmartSqlMapper的简单对比,我们就可以看出DyRepository的强大,为我们省下了很多代码。当然,ISmartSqlMapper自然也有它的灵活性,能够在任何地方使用。但是如果没有其他的特殊需求,在架构方面,因为对业务代码几乎无侵入,DyRepository无疑是最推荐的使用方式。

本文只介绍了DyRepository默认约定的使用方法,其实它还能通过各种配置项去实现更灵活的功能。详情请看下一节《DyRepository配置》。

2|0DyRepository配置



DyRepository的配置分为默认配置、特性配置和注册配置,但是都必须配置IoC注册,因为要都需要创建动态的接口实现到IoC中。

2|1必须的配置:



  1. 单个注册

    services.AddRepository<IUserRepository>();
  1. 批量注册

640?wx_fmt=png

2|2可选配置

特性配置指在接口上标注特性来配置DyRepository的配置项,而注册配置是指在IoC注册方法中配置,下面演示一下两者的不同。

Scope配置

场景

I{Scope}Repository是默认配置的Scope模版,如IUserRepository的Scope就是User。如果是这样的接口命名风格则无需再配置。
而当需要换接口命名风格,如查询User的Dao层名称是IUserDao,则需要配置对应的Scope。

特性配置

    [SqlMap(Scope = "User")]    
   public interface IUserDao{}

注册配置

640?wx_fmt=png


的,只要被扫描到的接口不同,就可以给不同的接口配置不同的属性

SqlId配置

SqlId默认是取仓储接口的方法名,只要方法名跟xml中的SqlId一样,则无需任何配置。

场景

因为SmartSql的sql配置是可以动态渲染的,当同一个SqlId传入不同的参数,可以渲染出不同的查询条件。例如:

640?wx_fmt=png

此时如果只用默认配置,写两个Query(string)方法就会有同方法名同参数类型而无法重载的问题。因此,此时需要接口方法名不同,而通过配置去指定相同的SqlId。

特性配置

640?wx_fmt=png

注册配置


册配置中是通过配置一个叫sqlIdNamingConvert的委托参数来实现接口方法名到SqlId的转换方法。

640?wx_fmt=png

需要注意的是,这个配置需要把AddSmartSqlRepositoryFactory和AddRepositoryFromAssembly两个方法分开,原因是前几个配置中的AddSmartSqlRepositoryFromAssembly方法内部调用过AddSmartSqlRepositoryFactory,如果再次调用会造成冲突。

其它配置

场景

如果希望SmartSql只做接口实现而不侵入接口,以上的注册配置基本就能满足大部分需求。

但是如果需要深入使用SmartSql,那么利用特性配置和一个泛型接口能得到更多额外的功能。

接口方法指定Sql

即直接给接口方法绑定sql,无需再从xml中配置sql了,但请注意参数前缀还是需要在对应的配置文件配置。

640?wx_fmt=png

即把接口方法的参数值传递给Sql渲染时指定参数名的参数,例如把id的值传递给@UserId:

640?wx_fmt=png

继承泛型接口之后,能够直接调用它里面的CURD通用方法。

  1. 同步调用:IRepository<TEntity, TPrimary>

  2. 异步调用:IRepositoryAsync<TEntity, TPrimary>


相关文章:

  • 如何通过本地化事件正确实现微服务内部强一致性,事件总线跨微服务间最终一致性

  • SmartCode 正式开源,不只是代码生成器!

  • SmartSql For Asp.Net Core 最佳实践

原文地址:https://www.cnblogs.com/ElderJames/p/9670296.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319349.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HDU 6889 Graph Theory Class(CCPC网络赛)

hdu 6889 传说中的人均min25 题意&#xff1a; n个点的完全图&#xff0c;边权为lcm(i1,j1)&#xff0c;求mst&#xff08;最小生成树&#xff09; 题解&#xff1a; 我一开始以为是推公式&#xff0c;毕竟数据范围这么大&#xff0c;但是自己画图来看看mst的情况 注意求lc…

Ocelot简易教程(六)之重写配置文件存储方式并优化响应数据

本来这篇文章在昨天晚上就能发布的&#xff0c;悲剧的是写了两三千字的文章居然没保存&#xff0c;结果我懵逼了。今天重新来写这篇文章。今天我们就一起来探讨下如何重写Ocelot配置文件的存储方式以及获取方式。作者&#xff1a;依乐祝原文地址&#xff1a;https://www.cnblog…

【线段树】蝴蝶与花(P6859)

正题 P6859 题目大意 给你一个由1,2组成的序列&#xff0c;要求完成写下列操作&#xff1a; 修改一个数查找一段区间&#xff0c;使其区间和为s&#xff08;输出左端点最小的一组&#xff09; 解题思路 用线段树来维护该序列&#xff0c;对于每次查询&#xff0c;先找到从1…

YbtOJ#912-神秘语言【结论,欧拉定理】

正题 题目链接:http://www.ybtoj.com.cn/problem/912 题目大意 给出L,RL,RL,R&#xff0c;求有多少长度在[L,R][L,R][L,R]之间的字符串满足依次取出所有偶数位置的放在最前面后&#xff0c;与原字符串相同。字符集是所有小写字母。 1≤Q≤5,1≤L≤R≤1010,R−L≤51041\leq Q\…

path hdu6705

题意&#xff1a; 一个有向加权图&#xff0c;问所有路径汇中第k小的路径长度是多少&#xff1f; 注意一个边可以反复走多次 题解 做法参考 我们可以利用优先队列来做 利用优先队列实现每次所取为最短边 我们假设一条路是从u—>v,路径和为sum&#xff0c;u->v是u的所以…

.NET Core实践系列之SSO-跨域实现

前言接着上篇的《.net core实践系列之SSO-同域实现》&#xff0c;这次来聊聊SSO跨域的实现方式。这次虽说是.net core实践&#xff0c;但是核心点使用jquery居多。建议看这篇文章的朋友可以先看上篇《.net core实践系列之SSO-同域实现》做一个SSO大概了解。源码地址&#xff1a…

P2150-[NOI2015]寿司晚宴【dp】

正题 题目链接:https://www.luogu.com.cn/problem/P2150 题目大意 将2∼n2\sim n2∼n选出一些分成两个集合&#xff0c;要求这两个集合中没有一对数不是互质的。求方案数对ppp取模 2≤n≤500,1≤p≤10102\leq n\leq 500,1\leq p\leq10^{10}2≤n≤500,1≤p≤1010 解题思路 数…

ABC181——F - Silver Woods

现在时间太少了&#xff0c;只能把自己不会的题补一下&#xff0c;会的题就不写了 F - Silver Woods 显然可以二分圆的半径&#xff0c;那么现在问题转化成判断半径为rrr的圆是否能够满足题意。 考虑什么情况下该半径的圆不能通过这些点。尝试用并查集维护一些关系 如果两个…

【树链剖分】洛谷树(P3401)

正题 P3401 题目大意 给你一棵树&#xff0c;让你进行以下操作 修改一条边的边权查询一条路径的所有子路径异或值的和 解题思路 记下所有点到根节点的路径亦或值&#xff0c;那么查询就是所有点对的异或值之和 因为边权<1024&#xff0c;最多只有10位&#xff0c;所以可…

牛客练习赛70 重新排列

来源&#xff1a;牛客网&#xff1a; 文章目录重新排列题解&#xff1a;代码&#xff1a;重新排列 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 题目描述 牛牛有个很喜欢的字符串”…

.NET 源代码库指南

微软.NET开发团队在博客上&#xff08;https://blogs.msdn.microsoft.com/dotnet/2018/10/15/guidance-for-library-authors/&#xff09;发布了.NET Library Guidance的第一个版本。这是一系列全新的文章&#xff0c;指导你为.NET创建高质量代码库。该指南包含我们已确定的适用…

P4774-[NOI2018]屠龙勇士【EXCRT】

正题 题目链接:https://www.luogu.com.cn/problem/P4774 题目大意 nnn个龙血量为aia_iai​&#xff0c;回复能力为pip_ipi​&#xff0c;死亡后掉落剑的攻击力tit_iti​&#xff0c;mmm把剑&#xff0c;攻击力为bib_ibi​。 从111开始打&#xff0c;每次使用不大于当前龙血量…

ARC107——D - Number of Multisets

D - Number of Multisets 之前写过一个类似表示的题&#xff08;2018CCPC吉林赛区——C - Justice&#xff09;&#xff0c;也是让用12,14,18…\frac1 2 ,\frac 14,\frac1 8 \dots21​,41​,81​…凑数&#xff0c;我效仿之前的思路写了个复杂度不清楚的东西&#xff08;非常爆…

【树链剖分】春季大扫除(P6805)

正题 P6805 题目大意 给你一棵树&#xff0c;每次可选择两个叶子结点&#xff0c;然后覆盖路径上的边&#xff0c;代价为其长度&#xff0c;每个叶子结点只能选一次。 对于每次询问&#xff0c;加入若干新点&#xff08;只会连接原树的点&#xff09;&#xff0c;问你覆盖所…

序列自动机

介绍 子串&#xff1a;串中任意个连续的字符组成的子序列称为该串的子串 子序列&#xff1a;子序列中的字符在字符串中不一定是连在一起的&#xff0c;而是删除其中若干个&#xff0c; 但子序列一定是单调的 简单说就是子序列不连续&#xff0c;子串连续 序列自动机可以在复杂…

基于gRPC服务发现与服务治理的方案

重温最少化集群搭建&#xff0c;我相信很多朋友都已经搭建出来&#xff0c;基于Watch机制也实现了出来&#xff0c;相信也有很多朋友有了自己的实现思路&#xff0c;但是&#xff0c;很多朋友有个疑问&#xff0c;我API和服务分离好了&#xff0c;怎么通过服务中心进行发现呢&a…

YbtOJ#723-欧拉之树【莫比乌斯反演,虚树】

正题 题目链接:http://www.ybtoj.com.cn/contest/121/problem/2 题目大意 给出nnn个点的一棵树&#xff0c;每个点有一个权值aia_iai​&#xff0c;求 ∑i1n∑j1ndis(i,j)φ(aiaj)\sum_{i1}^n\sum_{j1}^ndis(i,j)\times \varphi(a_i\times a_j)i1∑n​j1∑n​dis(i,j)φ(ai​…

拼凑 牛客练习赛70

来源&#xff1a;牛客网&#xff1a; 题目描述 牛牛还是很喜欢字符串"puleyaknoi"。 牛牛有T个超长超长的字符串&#xff0c;不过这次他更懒了&#xff0c;他希望直接在字符串中看见他喜欢的字符串。 如果一个子串中含有一个子序列是”puleyaknoi“&#xff0c;那么…

【kruskal】【倍增】严格次小生成树(P4180)

正题 P4180 题目大意 求严格次小生成树 解题思路 一定存在一种严格次小生成树&#xff0c;和最小生成树只差一条边&#xff0c;不然可以用一条最小生成树上的边代替&#xff0c;从而使边权和更小 那么可以先构造出最小生成树&#xff0c;然后枚举每一条不在最小生成树中的边…

ARC107——C - Shuffle Permutation

C - Shuffle Permutation 这几天遇到了很多&#xff08;2道&#xff09;并查集维护连通关系的题。 此题把能够相互交换的行或者列用并查集维护&#xff0c;不难发现一个连通块内的点个数时cntcntcnt连通块内的行或者列可以两两交换&#xff0c;那么对答案的贡献是cnt!cnt!cnt…