1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 利用ASP.netCore自带DI(DependencyInjection)实现批量依赖注入

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

时间:2022-08-06 14:41:12

相关推荐

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

转载来源/xiaoliangge/p/7642372.html

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 CoreAPI{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));//用 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[]>();}}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。