几十行代码实现ASP.NET Core自动依赖注入
在开发.NET Core web服务的时候,我们习惯使用自带的依赖注入容器来进行注入。
于是就会经常进行一个很频繁的的重复动作:定义一个接口->写实现类->注入
有时候会忘了写Add这一步,看到屏幕上的报错一脸懵逼,然后瞬间反应过来忘了注入了。赶紧补上serviceCollection.AddXXX这句话
虽然说有很多开源框架已经实现了类似的工作,比如AutoFac,Unity等依赖注入框架。但是这些库都太庞大了,我个人还是喜欢轻量级的实现。
定义一个枚举
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class AutoInjectAttribute : Attribute
{
public AutoInjectAttribute(Type interfaceType, InjectType injectType)
{
Type = interfaceType;
InjectType = injectType;
}
public Type Type { get; set; }
/// <summary>
/// 注入类型
/// </summary>
public InjectType InjectType { get; set; }
}
定义三种注入类型
/// <summary>
/// 注入类型
/// </summary>
public enum InjectType
{
Scope,
Single,
Transient
}
扫描运行目录下所有的dll,进行自动注入
/// <summary>
/// 自动依赖注入
/// </summary>
public static class AutoInject
{
/// <summary>
/// 自动注入所有的程序集有InjectAttribute标签
/// </summary>
/// <param name="serviceCollection"></param>
/// <returns></returns>
public static IServiceCollection AddAutoDi(this IServiceCollection serviceCollection)
{
var path = AppDomain.CurrentDomain.BaseDirectory;
var assemblies = Directory.GetFiles(path, "*.dll").Select(Assembly.LoadFrom).ToList();
foreach (var assembly in assemblies)
{
var types = assembly.GetTypes().Where(a => a.GetCustomAttribute<AutoInjectAttribute>() != null)
.ToList();
if (types.Count <= 0) continue;
foreach (var type in types)
{
var attr = type.GetCustomAttribute<AutoInjectAttribute>();
if (attr?.Type == null) continue;
switch (attr.InjectType)
{
case InjectType.Scope:
serviceCollection.AddScoped(attr.Type, type);
break;
case InjectType.Single:
serviceCollection.AddSingleton(attr.Type, type);
break;
case InjectType.Transient:
serviceCollection.AddTransient(attr.Type, type);
break;
default:
throw new ArgumentOutOfRangeException();
}
}
}
return serviceCollection;
}
}
使用自动依赖注入功能
public void ConfigureServices(IServiceCollection services)
{
services.AddAutoDi();
}
public interface ITest
{
string Say();
}
[AutoInject(typeof(ITest),InjectType.Scope)]
public class Test : ITest
{
public String Say()
{
return "test:"+DateTime.Now.ToString();
}
}
再次运行程序,所有的贴有AutoInject的所有的实现类,都会被注入到asp.net core的依赖注入容器中。
欢迎关注我的公众号
青城同学,不定时和你分享一些技术和有趣的事情。

几十行代码实现ASP.NET Core自动依赖注入的更多相关文章
- ASP.NET Core之依赖注入
本文翻译自:http://www.tutorialsteacher.com/core/dependency-injection-in-aspnet-core ASP.NET Core支持依赖注入,依赖 ...
- 【ASP.NET Core】依赖注入高级玩法——如何注入多个服务实现类
依赖注入在 ASP.NET Core 中起中很重要的作用,也是一种高大上的编程思想,它的总体原则就是:俺要啥,你就给俺送啥过来.服务类型的实例转由容器自动管理,无需我们在代码中显式处理. 因此,有了依 ...
- ASP.NET Core:依赖注入
ASP.NET Core的底层设计支持和使用依赖注入.ASP.NET Core应用程序可以利用内置的框架服务将它们注入到启动类的方法中,并且应用程序服务能够配置注入.由ASP.NET Core提供的默 ...
- Asp.net core自定义依赖注入容器,替换自带容器
依赖注入 在asp.net core程序中,众所周知,依赖注入基本上贯穿了整个项目,以通用的结构来讲解,控制器层(Controller层)依赖业务层(Service层),业务层依赖于仓储层(Repos ...
- asp.net core ioc 依赖注入
1.生命周期 内置的IOC有三种生命周期: Transient: Transient服务在每次被请求时都会被创建.这种生命周期比较适用于轻量级的无状态服务. Scoped: Scoped生命周期的服务 ...
- 用工厂模式解决ASP.NET Core中依赖注入的一个烦恼
这是最近在实际开发中遇到的一个问题,用 asp.net core 开发一个后端 web api ,根据指定的 key 清除 2 台 memcached 服务器上的缓存.背景是我们在进行 .net co ...
- 【半小时大话.net依赖注入】(下)详解AutoFac+实战Mvc、Api以及.NET Core的依赖注入
系列目录 上|理论基础+实战控制台程序实现AutoFac注入 下|详解AutoFac+实战Mvc.Api以及.NET Core的依赖注入 前言 本来计划是五篇文章的,每章发个半小时随便翻翻就能懂,但是 ...
- .Net Core 使用依赖注入
ASP.NET Core 源码阅读笔记(1) ---Microsoft.Extensions.DependencyInjection 在asp .net中使用依赖注入很简单,只需要在Startup类的 ...
- ASP.NETCore使用AutoFac依赖注入
原文:ASP.NETCore使用AutoFac依赖注入 实现代码 1.新建接口类:IRepository.cs,规范各个操作类的都有那些方法,方便管理. using System; using Sys ...
随机推荐
- NGK公链DeFi发力,Baccarat项目引爆流动性挖矿热潮
DeFi市值屡创新高,在这条康庄大道上,人们摩拳擦掌,就像90年代美国西部淘金热一般.DeFi带来的流动性挖矿构成了今年加密货币一道靓丽的风景线,而人们手握的不再是当年的锄头铲子,而是一串代码. 随着 ...
- YFI币之后,BGV能否主宰DeFi 沉浮?
回望今年,币圈风起云涌,比特币.YFI.BGV等一众数字货币共同打造了火热的币圈景象,在短短的时间里可以说是又形成了新的生态,业内对于BGV等新币种的认可度也达到了新高.2020已经接近尾声,放眼20 ...
- Java审计之CMS中的那些反序列化漏洞
Java审计之CMS中的那些反序列化漏洞 0x00 前言 过年这段时间比较无聊,找了一套源码审计了一下,发现几个有意思的点拿出来给分享一下. 0x01 XStream 反序列化漏洞 下载源码下来发现并 ...
- springboot学习过程随记
1.整合shiro+jwt(若忘记需结合测试代码springboot-mybatisplus-shiro-demo看) 配置比较简单 定义一个类继承AuthorizingRealm 如下: (1)pu ...
- iOS拍个小视频
需求 公司混合开发,uni端拍小视频不是很理想,为达到仿微信效果,原生插件走起 思路 第1步:1个AVCaptureSession, 1块AVCaptureVideoPreviewLayer[考虑兼容 ...
- [计算机图形学]视图变换:MVP变换、视口变换
目录 一.MVP变换 1. 模型变换 1.1 缩放矩阵 1.2 旋转矩阵 1.3 平移矩阵 2. 视角变换 3. 投影变换 二.Viewport变换 一.MVP变换 MVP变换是模型变换(M).视角变 ...
- 在 Svelte 中使用 CSS-in-JS
你即便不需要,但你可以. 注意:原文发表于2018-12-26,随着框架不断演进,部分内容可能已不适用. CSS 是任何 Web 应用程序的核心部分. 宽泛而论,如果一个 UI 框架没有内置向组件添加 ...
- Dos常用命令整理
Dos常用命令整理 打开cmd的方法 开始菜单 -> 系统 -> 命令提示符 组合键Win+R打开运行 -> 输入cmd 在任意文件夹下Shift+鼠标右键 -> 在此处打开命 ...
- CCF(再卖菜60分)爆搜+记忆化搜索+差分约束
201809-4 再卖菜 我使用的是爆搜解决,只得了60分. 记忆化搜索 差分约束 #include<iostream> #include<cstdio> #include&l ...
- WebService和Web API 区别
WebService的特征: 1 基于SOAP协议的,数据格式为XML 2 只支持HTTP协议,只能部署在IIS上 3 不是开源的,但可以被任意一个了解XML的人使用 SOAP :简单对象访问协议Si ...