150行代码打造.net core生产力工具,你值得拥有
你是否在初学 .net core时,被依赖注入所折磨?
你是否在开发过程中,为了注入依赖而不停的在Startup中增加注入代码,而感到麻烦?
你是否考虑过或寻找过能轻松实现自动注入的组件?
如果有,那请欢迎继续往下看。
或许你是被我这标题给吸引过来的,请不要怀疑自己的眼睛,如果你真的遇到过以上的问题,那我相信我的分享能帮助到你。
再次声明,我不是标题党。
闲话少说,此组件已经在我们公司内部使用半年有余,虽然代码不多,但也确确实实为公司同事解决些许麻烦事。为了响应公司开源的号召,所以决定将此组件开源。
在没有此工具之前,相信大多数使用core的程序员都是使用如下方式注入依赖的:
services.AddTransient<IStudentRepository, StudentRepository>();
services.AddTransient<IGroupRepository, GroupRepository>();
services.AddTransient<ISchoolRepository, SchoolRepository>();
.....
.....
.....
.....
此处省略若干行
但在项目的开发过程中,需要依赖注入的类存在频繁变动的情况,而时常会出现写了实体以及对应的接口后,而忘记添加注入代码情况。此情况不但增加了开发人员的重复而无意义的工作量,也可能会导致出现一些无谓的bug。
从上面的代码中我们可以发现,每一行的代码都非常相似,都是把一个接口和实现类注入到系统中,并设置生命周期为Transient,关于依赖注入相关的知识如果有不了解的,可以参考博客园中其他大神的讲解,这不是我这篇文章的重点。
那既然代码非常相似,那么我们就应该可以想办法封装一下,让代码去实现自动注入,至此,AutoDI组件应运而生。
使用AutoDI组件的方法如下:
首先,定义一个接口,示例如下:
public interface IStudentServices : IScopedAutoDIable
{
int GetId();
}
其次,定义接口的实现类:
public class StudentServices : IStudentServices
{
public int GetId()
{
return 1;
}
}
细心的朋友应该已经发现了,我上面代码的IStudentServices接口继承了IScopedAutoDIable,从字面意思应该就能看出这个接口是做什么。
注:接口和实现类的命名规则需要满足接口为Ixxx,类名为xxx的格式。
什么?看不懂英文?那好吧,我解释下吧,使用了AutoDI的项目在启动的时候,或自动搜索程序集中继承了IScopedAutoDIable的接口或类,找到后,会调用TryAddScoped方法将接口或类注入到系统中。同理,如果想将注入的生命周期改为瞬时的或者单例的,那只需要分别继承ITransientAutoDIable和ISingletonAutoDIable类即可。
最后,也是最重要的一步,在Startup类ConfigureServices方法中,写入如下代码:
services.AutoDI();
以上代码将会遍历程序所引用的所有程序集中继承了IAutoDIable接口的接口或类,然后实现自动注入。
当然了,有比较较真的或对代码有洁癖的人,可能会说,我不想遍历所有的程序集,这样会影响程序的启动速度。那咱也是有办法满足的,你只需在调用AutoDI接口时,将需要遍历的程序集指定即可。示例代码如下:
services.AutoDI(typeof(IAutoDIEntity).Assembly);
上述的代码中,程序将在IAutoDIEntity接口所在的类库中遍历继承了IAutoDIable接口的接口或类。这里写的IAutoDIEntity只是辅助获取程序集的接口,并无实际意义,你也可以换成你想遍历的程序集的任意的类或者接口。
到这里,或许还是会有人说,这还不能满足我的要求,我的接口和类已经继承了IXXXX接口了,我不想继承你定义的IAutoDIable这几个相关的接口,我想继承我自定义的接口。我只能说。。。。
可以,你想干嘛都可以。
如下所示:
services.AutoDI<IXXXX>();
到这里,此组件的使用方式已经描述完毕,有不清楚的小伙伴可以想办法与我联系。具体怎么联系,随你。反正我也不会搭理你们的。O(∩_∩)O哈哈~
不过,如果你在github上给我点了star的话,我或许可以考虑翻下你的牌子。
最后留下源码git地址:
https://github.com/billsking/WeShare.AutoDI
nuget请搜索:WeShare.AutoDI
再最后,发个武汉 .net 召集令
目前各地.net俱乐部活动做了一期又一期,我们大武汉竟然一场活动都没做过,笔者非常着急,非常想为社区贡献一份力量,所以想筹备2020年武汉.net俱乐部活动,目前已经准备了一些分享资料,预计2020年3月或者4月举办第一期线下活动。如果您有场地支持,有好的经验分享或者一些好的想法,请一定要留言告诉我,期待我们武汉的第一次活动能顺利举行。
点击链接加入群聊【武汉.Net微软技术俱乐部】:https://jq.qq.com/?_wv=1027&k=5YbyGhL
150行代码打造.net core生产力工具,你值得拥有的更多相关文章
- 120行代码打造.netcore生产力工具-小而美的后台异步组件
相信绝大部分开发者都接触过用户注册的流程,通常情况下大概的流程如下所示: 接收用户提交注册信息 持久化注册信息(数据库+redis) 发送注册成功短信(邮件) 写操作日志(可选) 伪代码如下: pub ...
- Android Studio 单刷《第一行代码》系列 02 —— 日志工具 LogCat
前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...
- java开发区块链只需150行代码
本文目的是通过java实战开发教程理解区块链是什么.将通过实战入门学习,用Java自学开发一个很基本的区块链,并在此基础上能扩展如web框架应用等.这个基本的java区块链也实现简单的工作量证明系统. ...
- 150行代码搭建异步非阻塞Web框架
最近看Tornado源码给了我不少启发,心血来潮决定自己试着只用python标准库来实现一个异步非阻塞web框架.花了点时间感觉还可以,一百多行的代码已经可以撑起一个极简框架了. 一.准备工作 需要的 ...
- 100行代码打造属于自己的代理ip池
经常使用爬虫的朋友对代理ip应该比较熟悉,代理ip就是可以模拟一个ip地址去访问某个网站.我们有时候需要爬取某个网站的大量信息时,可能由于我们爬的次数太多导致我们的ip被对方的服务器暂时屏蔽(也就是所 ...
- 150+行Python代码实现带界面的数独游戏
150行代码实现图形化数独游戏 Github地址,欢迎各位大佬们fork.star啥的,感谢: 今天闲着没事干,以前做过html+js版的数独,这次做个python版本的,界面由pygame完成,数独 ...
- 150行JavaScript代码实现增强现实
增强现实技术(Augmented Reality,简称 AR),是一种实时地计算摄影机影像的位置及角度并加上相应图像.视频.3D模型的技术,这种技术的目标是在屏幕上把虚拟世界套在现实世界并进行互动.这 ...
- 通过 Mesos、Docker 和 Go,使用 300 行代码创建一个分布式系统
[摘要]虽然 Docker 和 Mesos 已成为不折不扣的 Buzzwords ,但是对于大部分人来说它们仍然是陌生的,下面我们就一起领略 Mesos .Docker 和 Go 配合带来的强大破坏力 ...
- 通过Mesos、Docker和Go,使用300行代码创建一个分布式系统
[摘要]虽然 Docker 和 Mesos 已成为不折不扣的 Buzzwords ,但是对于大部分人来说它们仍然是陌生的,下面我们就一起领略 Mesos .Docker 和 Go 配合带来的强大破坏力 ...
随机推荐
- ES6 set和map数据结构对对象数组去重简单实现
自从有了es6的set数据结构,数组的去重可以简单用一行代码实现,比如下面的方式 let arr = [1, 2, 2, 3, 4] function unique (arr) { return [. ...
- C# 7.2 通过 in 和 readonly struct 减少方法值复制提高性能
在 C# 7.2 提供了一系列的方法用于方法参数传输的时候减少对结构体的复制从而可以高效使用内存同时提高性能 在开始阅读之前,希望读者对 C# 的值类型.引用类型有比较深刻的认知. 在 C# 中,如果 ...
- P1030 队列的基本操作
题目描述 现在给你一个队列,它一开始是空的,你需要模拟队列的操作.队列的操作包括如下: "push x":将元素 x 放入队列中,其中x是一个int范围内的整数: "po ...
- 2019牛客暑期多校训练营(第二场)F.Partition problem
链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...
- 闲来无事写一个jquery计算器,没有进行封装......
<!doctype html> <html> <head> <meta charset="utf-8" /> <title&g ...
- AutoHotKey 用打码的快捷键
本文告诉大家如何使用 AutoHotKey 将 - 键默认输入的时候是下划线,因为使用下划线在写代码的时候是用在私有字段,而 - 很少使用 我打码经常需要使用下划线_而下划线需要按shift+- 两个 ...
- Mybatis 框架
在之前的内容中,我写了Java的基础知识.Java Web的相关知识.有这些内容就可以编写各种各样丰富的程序.但是如果纯粹手写所有代码,工作量仍然很大.为了简化开发,隐藏一些不必要的细节,专心处理业务 ...
- 学习Java第二周
这是学习java的第二周,又这样不知不觉的结束了 上周想要学习的这一周也都做到了,可是觉得进度有些慢了,学习了: 1. 接口和抽象类: 2. 集合与数组: 3. 方法的定义: 4. 递归算法: 5.对 ...
- SSL/TLS 配置
Quick Start 下列说明将使用变量名 $CATALINA_BASE 来表示多数相对路径所基于的基本目录.如果没有为 Tomcat 多个实例设置 CATALINA_BASE 目录,则 $CATA ...
- MFC入门
目录 001.MFC_应用程序类型 002.MFC_对话框_静态文本_编辑框 003.MFC_对话框_访问控件_7种方法_A 004.MFC_对话框_访问控件_7种方法_B 005.M ...