转载来源 http://www.cnblogs.com/xiaoliangge/p/7642372.html

ASP.net Core自带DI(依赖注入),用法如下:

services.AddScoped(typeof(IProductService), typeof(ProductService));

如果服务较多,必定造成文件难以维护

所以需要利用反射批量实现注册

核心代码如下:

一个类可能间接继承了多个接口(例如:public 和internal的接口),这里我们就以实现类为Key,所继承的接口为value构造一个集合

     /// <summary>  /// 获取程序集中的实现类对应的多个接口/// </summary>  /// <param name="assemblyName">程序集</param>public Dictionary<Type, Type[]> GetClassName(string assemblyName){if (!String.IsNullOrEmpty(assemblyName)){Assembly assembly = Assembly.Load(assemblyName);List<Type> ts = assembly.GetTypes().ToList();var result = new Dictionary<Type, Type[]>();foreach (var item in ts.Where(s => !s.IsInterface)){var interfaceType = item.GetInterfaces();result.Add(item, interfaceType);}return result;}return new Dictionary<Type, Type[]>();}

注册:

我们现在可以把具体的注册例如

services.AddScoped(typeof(IProductService), typeof(ProductService));

改为:

        //集中注册服务foreach (var item in GetClassName("Service")){foreach (var typeArray in item.Value){services.AddScoped(typeArray, item.Key);}}

完整代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Microsoft.EntityFrameworkCore;
using Entity.Table;
using DAL;
using System.Reflection;
using Service;namespace ASP.NetCoreAPI
{public class Startup{public Startup(IConfiguration configuration){Configuration = configuration;}public IConfiguration Configuration { get; }// This method gets called by the runtime. Use this method to add services to the container.public void ConfigureServices(IServiceCollection services){services.AddDbContext<ProductContext>(options =>options.UseMySql(Configuration.GetConnectionString("MySqlConnection")));//添加Mysql支持//集中注册服务foreach (var item in GetClassName("Service")){foreach (var typeArray in item.Value){services.AddScoped(typeArray, item.Key);}}services.AddUnitOfWork<ProductContext>();//添加UnitOfWork支持//services.AddScoped(typeof(IProductService), typeof(ProductService));//用ASP.NET Core自带依赖注入(DI)注入使用的类services.AddMvc();}// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.public void Configure(IApplicationBuilder app, IHostingEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseMvc();}/// <summary>  /// 获取程序集中的实现类对应的多个接口/// </summary>  /// <param name="assemblyName">程序集</param>public Dictionary<Type, Type[]> GetClassName(string assemblyName){if (!String.IsNullOrEmpty(assemblyName)){Assembly assembly = Assembly.Load(assemblyName);List<Type> ts = assembly.GetTypes().ToList();var result = new Dictionary<Type, Type[]>();foreach (var item in ts.Where(s => !s.IsInterface)){var interfaceType = item.GetInterfaces();result.Add(item, interfaceType);}return result;}return new Dictionary<Type, Type[]>();}}
}

转载于:https://www.cnblogs.com/pxtxws/p/8975173.html

利用ASP.netCore自带DI(DependencyInjection)实现批量依赖注入相关推荐

  1. ASP.NET Core Web 应用程序系列(三)- 在ASP.NET Core中使用Autofac替换自带DI进行构造函数和属性的批量依赖注入(MVC当中应用)...

    在上一章中主要和大家分享了在ASP.NET Core中如何使用Autofac替换自带DI进行构造函数的批量依赖注入,本章将和大家继续分享如何使之能够同时支持属性的批量依赖注入. 约定: 1.仓储层接口 ...

  2. ASP.NET Core Web 应用程序系列(二)- 在ASP.NET Core中使用Autofac替换自带DI进行批量依赖注入(MVC当中应用)...

    在上一章中主要和大家分享在MVC当中如何使用ASP.NET Core内置的DI进行批量依赖注入,本章将继续和大家分享在ASP.NET Core中如何使用Autofac替换自带DI进行批量依赖注入. P ...

  3. ASP.NET Core Web 应用程序系列(一)- 使用ASP.NET Core内置的IoC容器DI进行批量依赖注入(MVC当中应用)...

    在正式进入主题之前我们来看下几个概念: 一.依赖倒置 依赖倒置是编程五大原则之一,即: 1.上层模块不应该依赖于下层模块,它们共同依赖于一个抽象. 2.抽象不能依赖于具体,具体依赖于抽象. 其中上层就 ...

  4. ASP.NET MVC中使用Autofac实现简单依赖注入

    本文参考资料: 1.https://www.cnblogs.com/RayWang/p/11128554.html. 2.https://www.cnblogs.com/eedc/p/6127181. ...

  5. .NET Core ASP.NET Core Basic 1-2 控制反转与依赖注入

    本节内容为控制反转与依赖注入 简介 控制反转IOC 这个内容事实上在我们的C#高级篇就已经有所讲解,控制反转是一种设计模式,你可以这样理解控制反转,假设有一个人他有一部A品牌手机,他用手机进行听歌.打 ...

  6. 控制反转_.NET Core ASP.NET Core Basic 12 控制反转与依赖注入

    本节内容为控制反转与依赖注入 简介 控制反转IOC 这个内容事实上在我们的C#高级篇就已经有所讲解,控制反转是一种设计模式,你可以这样理解控制反转,假设有一个人他有一部A品牌手机,他用手机进行听歌.打 ...

  7. IOC和DI 控制反转和依赖注入

    首先要分享的是Iteye的开涛这位技术牛人对Spring框架的IOC的理解,写得非常通俗易懂,以下内容全部来自原文,原文地址:http://jinnianshilongnian.iteye.com/b ...

  8. ASP.NET Core如何在ActionFilterAttribute里做依赖注入

    点击蓝字 关注我 在ASP.NET Core里,我们可以使用构造函数注入很方便地对Controller,ViewComponent等部件做依赖注入.但是如何给过滤器ActionFilterAttrib ...

  9. 通过编写DI容器来了解依赖注入-从头开始! (第2部分)

    这是我的" DI从零开始"系列的第二部分. 在上一篇文章中,我们讨论了我们的基本示例以及"手动"方法存在的问题. 现在,我们要使服务网络的布线自动化. DI S ...

最新文章

  1. Anaconda 2019.03 发布,Python 跨平台科学计算软件
  2. Sql Server数据库数据导入到SQLite数据库中
  3. Navicat向sqlserver中插入数据时提示:当 IDENTITY_INSERT 设置为 OFF 时,不能向表中的标识列插入显式值
  4. Android测试(二)——drozer使用
  5. python numpy库中省略号...的一些用法
  6. oidc auth2.0_将Auth0 OIDC(OAUTH 2)与授权(组和角色)集成
  7. 使用Java 8 Lambda清理JUnit Throwable-Tests
  8. easy html css tree 简单的HTML css导航树
  9. Android 文件管理器 Android文件管理器源代码
  10. Sandbox简介和路径获取
  11. [纯前端]打造自己的ORK管理软件
  12. node.js 快速入门
  13. 漫威超级英雄大全(二)
  14. python ocr 识别中文pdf_基于Python实现对PDF文件的OCR识别
  15. 服务器显示屏 超出工作频率范围,如何解决显示器出错提示:超出工作频率范围...
  16. 2021-09-07 照书码——_——
  17. 我写过的软件之TSE-工作流程和实现
  18. Redis设置密码,查看密码,修改密码,忘记密码。
  19. pytorch 中 混合精度训练(真香)
  20. (转)深入理解最强桌面地图控件GMAP.NET --- SOSO地图

热门文章

  1. 凯立德手机导航APP全新升级 小长假结伴出行说走就走
  2. 单指手势,旋转,缩放
  3. 前缀、中缀、后缀表达式及其相互转化的Java实现
  4. [转]Android有效解决加载大图片时内存溢出的问题
  5. Java机器学习库ML之十模型选择准则AIC和BIC
  6. wordpress漏洞_多个WordPress插件SQL注入漏洞分析
  7. fastjson的值过滤器ValueFilter || fastjson输出字段为Null的两种
  8. Spring的新注解——Configuration、ComponentScan、Bean、Import、PropertySource || spring整合Junit分析
  9. java修改JFrame默认字体
  10. 关于eclipse 中文注释时中文字体太小的问题解决