DIManager
using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Linq; namespace Scg.Core.Extensions.DependencyInjection { /// <summary> /// 依赖注入管理类 /// </summary> public static class DIManager { private static IServiceProvider provider; /// <summary> /// 必须在所有Service注册完成之后调用,否则会导致手动Resolve某个Service的时候失败 /// </summary> /// <param name="services"></param> public static IServiceProvider BuildProvider(IServiceCollection services) { return provider = services.BuildServiceProvider(); } /// <summary> /// /// </summary> /// <param name="serviceProvider"></param> /// <returns></returns> public static IServiceProvider SetProvider(IServiceProvider serviceProvider) { return provider = serviceProvider; } /// <summary> /// 获取已注册的服务 /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> public static T GetService<T>() { return provider.GetService<T>(); } public static T GetRequiredService<T>() { return provider.GetRequiredService<T>(); } /// <summary> /// 获取已注册的服务 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="serviceNameStartsWith"></param> /// <returns></returns> public static T GetService<T>(string serviceNameStartsWith) { var services = GetService<IEnumerable<T>>(); return services.FirstOrDefault(x => x.GetType().Name.StartsWith(serviceNameStartsWith)); } /// <summary> /// 获取已注册的服务 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="services"></param> /// <param name="serviceNameStartsWith"></param> /// <returns></returns> public static T GetService<T>(IEnumerable<T> services, string serviceNameStartsWith) { return services.FirstOrDefault(x => x.GetType().Name.StartsWith(serviceNameStartsWith)); } /// <summary> /// 获取服务,为空时使用给定值 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="instance"></param> /// <returns></returns> public static T GetServiceOrDefault<T>(T instance) { var service = provider.GetService<T>(); if (service == null) { return instance; } return service; } /// <summary> /// 获取已注册的服务(租户化实现,若未找到实现,将获取租户code为generic的实现) /// </summary> /// <typeparam name="T"></typeparam> /// <param name="code">租户Code</param> /// <returns></returns> public static T GetTenantService<T>(string code) where T : class { //var services = provider.GetServices<T>(); //foreach (var service in services) //{ // var attr = service.GetType().GetTypeInfo().GetCustomAttribute<TenantCodesAttribute>(false); // if (attr != null && attr.Codes.Any(p => p.Equals(code, StringComparison.OrdinalIgnoreCase) || p == DIConstants.GenericTenantCode)) // { // return service; // } //} return null; } /// <summary> /// 创建实例(该实例初始化依赖于已注册的部分服务) /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> public static T NewInstance<T>() { return ActivatorUtilities.CreateInstance<T>(provider); } } }
startUp中ConfigureServices处 DIManager.BuildProvider(services);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2021-06-24 .NET技术与企业级信息化解决方案咨询
2020-06-24 input type=button button
2020-06-24 select @@identity的用法
2020-06-24 C#-函数的传值与传址
2020-06-24 关于C#函数对象参数传递的问题
2020-06-24 SQLSERVER聚集索引和主键(PrimaryKey)的误区认识
2020-06-24 #中string字符串转为json与json转对象