aspnetcore里面用到许多的service,好多业务代码都要通过Service.AddScoped、Singleton、Transient等注入进去,类太多了写起来和管理起来都很麻烦,所以借鉴了一下github上面的项目稍微删减了一下下,最后会给出参考链接和git源代码。

项目结构如下,

这里面有些约定的东西一定要遵守,否则会出错,还有webapi必须要引用business和ibusiness,只引用ibusiness是不行的。

核心代码如下:

 1 using Microsoft.Extensions.DependencyInjection;
2 using System;
3 using System.Collections.Generic;
4 using System.Linq;
5 using System.Text;
6 using System.Threading.Tasks;
7 using My.Project.Ioc.Core.IService;
8
9 namespace My.Project.Ioc.Core.Extensions
10 {
11 public static partial class ServiceExtensions
12 {
13 /// <summary>
14 /// 自动注入拥有ITransientDependency,IScopeDependency或ISingletonDependency的类
15 /// </summary>
16 /// <param name="services">服务集合</param>
17 /// <returns></returns>
18 public static IServiceCollection AddFxServices(this IServiceCollection services)
19 {
20 Dictionary<Type, ServiceLifetime> lifeTimeMap = new Dictionary<Type, ServiceLifetime>
21 {
22 { typeof(ITransientDependency), ServiceLifetime.Transient},
23 { typeof(IScopedDependency),ServiceLifetime.Scoped},
24 { typeof(ISingletonDependency),ServiceLifetime.Singleton}
25 };
26
27 GlobalData.AllFxTypes.ForEach(aType =>
28 {
29 lifeTimeMap.ToList().ForEach(aMap =>
30 {
31 var theDependency = aMap.Key;
32 if (theDependency.IsAssignableFrom(aType) && theDependency != aType && !aType.IsAbstract && aType.IsClass)
33 {
34 //注入实现
35 services.Add(new ServiceDescriptor(aType, aType, aMap.Value));
36
37 var interfaces = GlobalData.AllFxTypes.Where(x => x.IsAssignableFrom(aType) && x.IsInterface && x != theDependency).ToList();
38 //有接口则注入接口
39 if (interfaces.Count > 0)
40 {
41 interfaces.ForEach(aInterface =>
42 {
43 services.Add(new ServiceDescriptor(aInterface, serviceProvider => serviceProvider.GetService(aType), aMap.Value));
44 });
45 }
46 //无接口则注入自己
47 else
48 {
49 services.Add(new ServiceDescriptor(aType, aType, aMap.Value));
50 }
51 }
52 });
53 });
54
55 return services;
56 }
57 }
58 }
 1 using System;
2 using System.Collections.Generic;
3 using System.IO;
4 using System.Linq;
5 using System.Reflection;
6 using System.Text;
7 using System.Threading.Tasks;
8
9 namespace My.Project.Ioc.Core
10 {
11 public static class GlobalData
12 {
13 static GlobalData()
14 {
15 string rootPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
16 AllFxAssemblies = Directory.GetFiles(rootPath, "*.dll")
17 .Where(x => new FileInfo(x).Name.Contains(FXASSEMBLY_PATTERN))
18 .Select(x => Assembly.LoadFrom(x))
19 .Where(x => !x.IsDynamic)
20 .ToList();
21
22 AllFxAssemblies.ForEach(aAssembly =>
23 {
24 try
25 {
26 AllFxTypes.AddRange(aAssembly.GetTypes());
27 }
28 catch
29 {
30
31 }
32 });
33 }
34
35 /// <summary>
36 /// 解决方案程序集匹配名
37 /// </summary>
38 public const string FXASSEMBLY_PATTERN = "My.Project.Ioc";
39
40 /// <summary>
41 /// 解决方案所有程序集
42 /// </summary>
43 public static readonly List<Assembly> AllFxAssemblies;
44
45 /// <summary>
46 /// 解决方案所有自定义类
47 /// </summary>
48 public static readonly List<Type> AllFxTypes = new List<Type>();
49 }
50 }

非核心代码如下:

参考项目Coldairarrow/Colder.Admin.AntdVue: Admin Fx Based On .NET 5 + Ant Design Vue (github.com) ,有兴趣的可以研究下非常不错。当然里面关于aop和缓存方面我有另外的项目例子可以加进去改造exercise/netcore.demo/AspNetCoreEntityFrameWork at master · liuzhixin405/exercise (github.com)

netcore依赖注入通过反射简化的更多相关文章

  1. Laravel框架下容器Container 的依赖注入和反射应用

    依赖注入,简单说是把类里头依赖的对象,置于类外头,即客户端调用处.相当于把类与类解耦. 一个简单的例子: class A { public function __construct() { // 这种 ...

  2. C#反射与特性(六):设计一个仿ASP.NETCore依赖注入Web

    目录 1,编写依赖注入框架 1.1 路由索引 1.2 依赖实例化 1.3 实例化类型.依赖注入.调用方法 2,编写控制器和参数类型 2.1 编写类型 2.2 实现控制器 3,实现低配山寨 ASP.NE ...

  3. Asp.NetCore依赖注入和管道方式的异常处理及日志记录

    前言     在业务系统,异常处理是所有开发人员必须面对的问题,在一定程度上,异常处理的能力反映出开发者对业务的驾驭水平:本章将着重介绍如何在 WebApi 程序中对异常进行捕获,然后利用 Nlog ...

  4. NetCore 依赖注入之服务之间的依赖关系

    简单介绍,直接官方文档 https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/dependency-injection?view=aspn ...

  5. c# 依赖注入之---反射(转)

    详细请看http://www.cnblogs.com/leoo2sk/archive/2009/06/17/1504693.html 定义一个接口,和两个类(实现该接口) IButton: using ...

  6. .netcore中的依赖注入

    IOC.DI相关概念的理解 1.依赖:简单的讲就是"引用到".例如AccountController.cs引用到IAccountService.cs,那么AccountContro ...

  7. PHP 在Swoole中使用双IoC容器实现无污染的依赖注入

    简介: 容器(container)技术(可以理解为全局的工厂方法), 已经是现代项目的标配. 基于容器, 可以进一步实现控制反转, 依赖注入. Laravel 的巨大成功就是构建在它非常强大的IoC容 ...

  8. NetCore+Dapper WebApi架构搭建(四):仓储的依赖注入

    上一节我们讲到实体,仓储接口和仓储接口的实现需要遵循约定的命名规范,不仅是规范,而且为了依赖注入,现在我们实现仓储的依赖注入 在NetCore WebApi项目中新添加一个文件夹(Unit),当然你也 ...

  9. 采用dom4j和反射模拟Spring框架的依赖注入功能

    Spring的依赖注入是指将对象的创建权交给Spring框架,将对象所依赖的属性注入进来的行为.在学习了dom4j后,其实也可以利用dom4j和反射做一个小Demo模拟Spring框架的这种功能.下面 ...

  10. 基于反射的通过set方法的依赖注入,可以看成一种设计模式,自己来用

    非常好用,在properties文件中配置字符串和类名之间的对应,在程序里读取文件,找到类名,通过反射,达到调用set方法的目的,然后直接将自己的指向其他类的对象的引用赋值,指向实体对象. 比如use ...

随机推荐

  1. PDF的分割与合并

    1.进行PDF切割 python代码如下: # 20220521 # 1.选择要分割的文件 # 2.选择要保存的位置,分割为多个文件时,可自动用页码命名 # 3.输入要分割的页码,可以是一个范围1-2 ...

  2. 替代 Redis 的开源项目「GitHub 热点速览」

    近日,知名开源项目 Redis 宣布修改开源协议,从原来的「BSD 3-Clause 开源协议」改成「RSALv2 和 SSPLv1 双重许可证」.新的许可证主要是限制托管 Redis 产品的云服务商 ...

  3. 【Docker】Dockerfile基础知识,相信你一定有所收获

    Dockerfile常用命令 FROM: 继承基础镜像 MAINTAINER:镜像制作作者信息 RUN: 用来执行shell命令 EXPOSE: 暴露端口号 CMD: 启动容器默认执行的命令,会被覆盖 ...

  4. KDE算法解析

    核密度估计(Kernel Density Estimation, KDE)算法通过样本估计这些样本所属的概率密度函数,是non-parametric方法,也就是在进行估计时无需假设分布的具体形式.本文 ...

  5. KingbaseES V8R3集群运维案例---failover切换故障分析

    案例说明: KingbaseES V8R3集群主库数据库服务重启后,failover切换失败,分析failover失败的具体原因. 适用版本: KingbaseES V8R3 一.集群架构 node1 ...

  6. 怎么查看摄像头的硬件ID

    1.打开设备管理器:电脑桌面左下角Windows图标点击鼠标右键,点击[设备管理器] 2.展开[照相机] 3.双击摄像头,弹出属性框 4.点击[详细信息],属性点击[硬件ID]

  7. Native API在HarmonyOS应用工程中的使用指导

      HarmonyOS的应用必须用js来桥接native.需要使用ace_napi仓中提供的napi接口来处理js交互.napi提供的接口名与三方Node.js一致,目前支持部分接口,符号表见ace_ ...

  8. 开发指导—利用组件&插值器动画实现HarmonyOS动效

    一. 组件动画 在组件上创建和运行动画的快捷方式.具体用法请参考通用方法. 获取动画对象 通过调用animate方法获得animation对象,animation对象支持动画属性.动画方法和动画事件. ...

  9. 重新整理 .net core 实践篇————防跨站脚本攻击[四十]

    前言 简单整理一下跨站脚本攻击. 正文 攻击原理是这样子的: 这种攻击被攻击的面挺多的,比如说只要有一个可以让用户输入的注入脚本就都是一个问题. 给网站注入脚本 然后用户访问给网站注入的脚本 脚本里面 ...

  10. Java:得到指定年份、月份、周次的最后一天

    使用Java的工具类Calendar 通过Calendar可以进行很多的日期操作 /** * 得到指定年份的最后一天 * @param year */ public static void getLa ...