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适合场景
使用了仓储模式的架构
仓储模式主要在DDD战术中运用,用来隔离领域和数据库。DyRepository的功能需求主要是在DDD的实践中发现的,目前为止已经满足DDD实践的大部分需求,如果还有其他的相关需求欢迎提出Issue。
类似SqlHepler的应用
DyRepository可以将任意一个接口实现出查询数据库的工具,CURD方法不在话下。通过接口注入更能发挥解耦的作用。
1|3使用介绍
下面会简单演示DyRepository与ISmartSqlMapper的使用对比。
准备工作
先创建一个仓储,这个仓储不依赖SmartSql,只是普普通通的仓储接口
创建配置xml文件SmartSqlMapConfig.xml:
再创建xml配置文件Activity.xml,放到Maps目录,并且在属性面板设置为“始终复制”:
准备工作完成,下面就可以展示两种用法的区别。
两种用法
ISmartSqlMapper 用法
如果不用DyRepository,我们需要用ISmartSqlMapper实现这个仓储。
再把实现类注册到IoC中:Dp
y
如果使用DyRepository,我们只需配置一下IoC注册即可。
注入使用
使用方法就注入接口,再调用接口方法了。
1|4总结
通过DyRepository与ISmartSqlMapper的简单对比,我们就可以看出DyRepository的强大,为我们省下了很多代码。当然,ISmartSqlMapper自然也有它的灵活性,能够在任何地方使用。但是如果没有其他的特殊需求,在架构方面,因为对业务代码几乎无侵入,DyRepository无疑是最推荐的使用方式。
本文只介绍了DyRepository默认约定的使用方法,其实它还能通过各种配置项去实现更灵活的功能。详情请看下一节《DyRepository配置》。
2|0DyRepository配置
DyRepository的配置分为默认配置、特性配置和注册配置,但是都必须配置IoC注册,因为要都需要创建动态的接口实现到IoC中。
2|1必须的配置:
单个注册
services.AddRepository<IUserRepository>();
批量注册
2|2可选配置
特性配置指在接口上标注特性来配置DyRepository的配置项,而注册配置是指在IoC注册方法中配置,下面演示一下两者的不同。
Scope配置
场景
I{Scope}Repository是默认配置的Scope模版,如IUserRepository的Scope就是User。如果是这样的接口命名风格则无需再配置。
而当需要换接口命名风格,如查询User的Dao层名称是IUserDao,则需要配置对应的Scope。
特性配置
[SqlMap(Scope = "User")]
public interface IUserDao{}
注册配置
的,只要被扫描到的接口不同,就可以给不同的接口配置不同的属性
SqlId配置
SqlId默认是取仓储接口的方法名,只要方法名跟xml中的SqlId一样,则无需任何配置。
场景
因为SmartSql的sql配置是可以动态渲染的,当同一个SqlId传入不同的参数,可以渲染出不同的查询条件。例如:
此时如果只用默认配置,写两个Query(string)方法就会有同方法名同参数类型而无法重载的问题。因此,此时需要接口方法名不同,而通过配置去指定相同的SqlId。
特性配置
注册配置
册配置中是通过配置一个叫sqlIdNamingConvert的委托参数来实现接口方法名到SqlId的转换方法。
需要注意的是,这个配置需要把AddSmartSqlRepositoryFactory和AddRepositoryFromAssembly两个方法分开,原因是前几个配置中的AddSmartSqlRepositoryFromAssembly方法内部调用过AddSmartSqlRepositoryFactory,如果再次调用会造成冲突。
其它配置
场景
如果希望SmartSql只做接口实现而不侵入接口,以上的注册配置基本就能满足大部分需求。
但是如果需要深入使用SmartSql,那么利用特性配置和一个泛型接口能得到更多额外的功能。
接口方法指定Sql
即直接给接口方法绑定sql,无需再从xml中配置sql了,但请注意参数前缀还是需要在对应的配置文件配置。
即把接口方法的参数值传递给Sql渲染时指定参数名的参数,例如把id的值传递给@UserId:
继承泛型接口之后,能够直接调用它里面的CURD通用方法。
同步调用:
IRepository<TEntity, TPrimary>
异步调用:
IRepositoryAsync<TEntity, TPrimary>
相关文章:
如何通过本地化事件正确实现微服务内部强一致性,事件总线跨微服务间最终一致性
SmartCode 正式开源,不只是代码生成器!
SmartSql For Asp.Net Core 最佳实践
原文地址:https://www.cnblogs.com/ElderJames/p/9670296.html
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com