首页 > 其他分享 >.Net6-利用IServiceProvider实现全局依赖注入

.Net6-利用IServiceProvider实现全局依赖注入

时间:2024-04-17 14:11:31浏览次数:27  
标签:serviceType ServiceProvider static Net6 services IServiceProvider 全局 type public

需求背景:自定义类库程序中的类文件引用IService接口对象并实现依赖注入。

1.修改应用程序Program.cs文件

1 var builder = WebApplication.CreateBuilder(args);
2 builder.Services.AddProgramService();
3 
4 
5 var app = builder.Build();
6 InternalApp.ServiceProvider = app.Services;

2.服务注册

 1 public  static class DIServiceExtensions
 2     {
 3         public static void AddProgramService(this IServiceCollection services)
 4         {
 5             string[] clas = new string[] { "XX.Repository", "XX.Service" };
 6             foreach (string c in clas)
 7             {
 8                 Register(services, c);
 9             }
10         }
11 
12         private static void Register(IServiceCollection services,string item)
13         {
14             Assembly assembly = Assembly.Load(item);
15             foreach(var type in assembly.GetTypes())
16             {
17                 var serviceAttribute = type.GetCustomAttribute<AppServiceAttribute>();
18 
19                 if(serviceAttribute != null)
20                 {
21                     var serviceType = serviceAttribute.ServiceType;
22                     if(serviceType == null && serviceAttribute.InterfaceServiceType)
23                     {
24                         serviceType = type.GetInterfaces().FirstOrDefault();
25                     }
26                     if(serviceType == null)
27                     {
28                         serviceType = type;
29                     }
30 
31                     switch(serviceAttribute.ServiceLifetime)
32                     {
33                         case LifeTime.Singleton:
34                             services.AddSingleton(serviceType,type);
35                             break;
36                         case LifeTime.Scoped:
37                             services.AddScoped(serviceType, type);
38                             break;
39                         case LifeTime.Transient:
40                             services.AddTransient(serviceType, type);
41                             break;
42                         default:
43                             services.AddTransient(serviceType, type);
44                             break;
45                     }
46 
47                     System.Console.WriteLine($"注册:{serviceType}");
48                 }
49             }
50         }
51     }

3. 新建InternalApp类文件

1     public static class InternalApp
2     {
3         /// <summary>
4         /// 应用服务
5         /// </summary>
6         public static IServiceProvider ServiceProvider;
7     }

4. 新建GlobalContext.cs文件

 1 public static class GlobalContext
 2  {
 3         /// <summary>
 4         /// 服务提供器
 5         /// </summary>
 6         public static IServiceProvider ServiceProvider => InternalApp.ServiceProvider;
 7 
 8         /// <summary>
 9         /// 获取请求生命周期的服务
10         /// </summary>
11         /// <param name="type"></param>
12         /// <returns></returns>
13         public static object GetService(Type type)
14         {
15             return ServiceProvider.GetService(type);
16         }
17 
18         public static TService GetService<TService>() where TService : class
19         {
20             return GetService(typeof(TService)) as TService;
21         }
22  }

5. 类文件调用服务对象

1 public class A
2 {
3      private readonly IAService _AService = GlobalContext.GetService<IAService>();
4 }

 

标签:serviceType,ServiceProvider,static,Net6,services,IServiceProvider,全局,type,public
From: https://www.cnblogs.com/mingcore/p/18140092

相关文章

  • 解决.Net6 部署到ubuntu22.04中使用DotNetCore.NPOI 导出报 Could not open display (
    在Ubuntu22环境下,出现"Couldnotopendisplay(X-Serverrequired.CheckyourDISPLAYenvironmentvariable)"错误可能是由于缺少X服务器或未正确配置DISPLAY环境变量导致的。以下是你可以尝试的解决方法:检查DISPLAY环境变量:确保DISPLAY环境变量已正确设置。使......
  • 重载全局的new和delete
    重载全局的new和delete::operatornew::operatornew[]->不可以被声明与同一个namespace之内new会执行三个动作:->之前的代码提到:new本身会开辟内存空间.所以声明方法需要一个size_tsize的参数inlinevoid*operatornew(size_tsize){}::operatordelete::......
  • net6 类中获取服务
    第一种实现方式(不推荐)varservices=newServiceCollection();varprovider=services.BuildServiceProvider();var_demoService=provider.GetService<IDemoService>();varservices=newServiceCollection();varprovider=services.BuildServiceProvider();v......
  • 实现自定义注解校验方法参数(AOP+自定义注解+自定义异常+全局异常捕获)
    一、实现目的在编写接口的时候,通常会先对参数进行一次校验,这样业务逻辑代码就略显冗杂,如果可以把校验参数的代码进行统一管理,在方法或者属性上直接添加注解就可以实现参数的校验,就可以提升代码编写的效率。二、实现原理通过自定义注解,注解在入参VO的属性上,设定需要满足的条件,然......
  • 03_NET6中使用Autofac
    安装包:AutofacAutofac.Extensions.DependencyInjectionAutofac.Extras.DynamicProxy中文文档:欢迎来到Autofac中文文档!—Autofac4.0documentation(autofac-.readthedocs.io) 1.新建一个webapi项目新建一个AutofacMamager类,用于注册publicclassAutofacMamager......
  • 多线程下写全局变量时,可借助sleep(0)让出cpu
    目录一个demo(对全局变量++)-->反汇编阅读cpu指令多个线程都去对全局变量++线程不挂起sleep(0)使线程挂起,让出cpu总结一下为啥不到10W?加锁版本近期在重读APUE,对unix下多线程有了新的理解用一个小demo来说明多线程下写全局变量时,让出cpu(使线程挂起)的重要性一个demo(对全局变量++)-......
  • ROS中自定义全局算法规划器(c++)
     ros中编写一个全局路径规划器并集成为ros插件,加载到turtlebot3机器人平台上仿真验证参考资料:ROS中自定义全局规划器(上)_算法部署_哔哩哔哩_bilibili官网教程:navigation/Tutorials/WritingAGlobalPathPlannerAsPlugininROS-ROSWiki1.建立工作空间mkdir-pjps_......
  • jmeter全局变量跨线程使用
    混合场景:不同数量的并发用户数,向不同接口发起请求**---这种才是真正的混合场景,才真正符合企业产品实际情况  跨线程组传参   线程组1 30   线程组2 20   线程组3 10 一、注册接口,请求成功后,返回的手机号用于登录,先用json提取器取出手机号,设置手机号为全......
  • GIL全局解释锁
    GIL全局解释锁官方对于GIL全局锁的解释InCPython,theglobalinterpreterlock,orGIL,isamutexthatpreventsmultiplenativethreadsfromexecutingPythonbytecodesatonce.ThislockisnecessarymainlybecauseCPython’smemorymanagementisnotthrea......
  • 处理全局样式
    示例本次采用vite+vue3首先在@/themes/variable.scss文件创建:root{ --bg-color:#22416f;//默认背景颜色--color:rgb(39,204,207);--el-color-primary:#fff;}$bg-color:var(--bg-color);//默认背景颜色$color:var(--color);$All-color:var(--el-col......