Webapi(.net6) 批量服务注册

如果不考虑第三方库,如Autofac这种进行服务注入,通过本身的.Core Weabpi实现的,总结了两种实现方法,

1.一种是参考abp框架里面的形式;

1.1 新建个生命周期的文件夹:

在这里插入图片描述
三个接口分别为:

public interface IScopedDependency
{
}
public interface ISingletonDependency
{
}
 public interface ITransientDependency{}

在实现类中使用如下:

 public interface IUserService{}public class UserService : IUserService, ITransientDependency{}

1.2 建立个批量服务注册的扩展方法:

public static class ConfigSservice
{public static void BatchAddServices(this IServiceCollection services, string assemblyString){var assembly = Assembly.Load(assemblyString);var types = assembly.GetTypes();var list = types.Where(u => u.IsClass && !u.IsAbstract && !u.IsGenericType&& (typeof(ITransientDependency).IsAssignableFrom(u)|| typeof(IScopedDependency).IsAssignableFrom(u)|| typeof(ISingletonDependency).IsAssignableFrom(u))).ToList();foreach (var type in list){var interfaceList = type.GetInterfaces();if (interfaceList.Any()){var inter = interfaceList.First();if (typeof(ITransientDependency).IsAssignableFrom(type))services.AddTransient(inter, type);else if (typeof(IScopedDependency).IsAssignableFrom(type))services.AddScoped(inter, type);elseservices.AddSingleton(inter, type);}}}
}

在Programe下注册:

builder.Services.BatchAddServices("WebApi6");

2.第二种通过特性方法:

2.1 新建个注入特性类:

 [AttributeUsage(AttributeTargets.Class, Inherited = false,AllowMultiple = false)]public class InjectServiceAttribute : Attribute{public Type ServiceType { get; set; }public ServiceLifetime Lifetime { get; set; }}

使用方法如下:

  public interface IUserService{}[InjectService(Lifetime = ServiceLifetime.Transient, ServiceType = typeof(IUserService))]public class UserService{}

2.2 扩展方法如下:

public static class DependencyInjection
{public static void AddServices(this IServiceCollection services, string assemblyName){var assembly = Assembly.Load(assemblyName);if (assembly != null){var types = assembly.GetTypes().Where(s => s.IsClass && !s.IsAbstract).ToList();foreach (var type in types){var injectService = type.GetCustomAttribute<InjectServiceAttribute>();if (injectService == null)continue;var serviceType = injectService.ServiceType ?? type;var implementationType = type;var lifetime = injectService.Lifetime;services.Add(new ServiceDescriptor(serviceType, implementationType, lifetime));}}}
}
builder.Services.AddServices("WebApi6");

如有不对或者建议,欢迎提出指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/542830.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

因为manifest.json文件引起的 android-chrome-192x192.png 404 (Not Found)

H5项目打包之后&#xff0c;总是有这个报错&#xff0c;有时候还有别的icon也找不见 一通调查之后&#xff0c;发现是因为引入了一个vue插件 这个插件引入之后&#xff0c;webpack打包的时候就会自动在dist文件夹中产生一个manifest.json文件这个文件里面主要就是一些icon地址的…

最详细爬虫零基础教程02——http协议和请求头的介绍

文章目录 复习一、http和https协议二、网络请求的过程1.浏览器发送http请求的过程2.DNS服务器 三、Headers参数介绍总结 复习 在本节开始讲述的时候&#xff0c;我们先来复习一下爬虫的基本步骤&#xff1a; 一、http和https协议 HTTP协议&#xff08;Hypertext Transfer Pr…

【C++ RB树】

文章目录 红黑树红黑树的概念红黑树的性质红黑树节点的定义红黑树的插入代码实现总结 红黑树 AVL树是一颗绝对平衡的二叉搜索树&#xff0c;要求每个节点的左右高度差的绝对值不超过1&#xff0c;这样保证查询时的高效时间复杂度O( l o g 2 N ) log_2 N) log2​N)&#xff0c;…

【C++ 设计模式】策略模式与简单工厂模式的结合

文章目录 前言一、为什么需要策略模式简单工厂模式二、策略模式简单工厂模式实现原理三、UML图四、示例代码总结 前言 在软件设计中&#xff0c;常常会遇到需要根据不同情况选择不同算法或行为的情况。策略模式和简单工厂模式是两种常见的设计模式&#xff0c;它们分别解决了对…

机器学习-04-分类算法-02贝叶斯算法

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中分类算法&#xff0c;本篇为分类算法与贝叶斯算法部分。 本门课程的目标 完成一个特定行业的算法应用全过程&#xff1a; 懂业务会选择合适的算法数据处理算法训练算法调优算法融合 算法评估持续调优工程…

如何使用Python进行数据可视化:Matplotlib和Seaborn指南【第123篇—Matplotlib和Seaborn指南】

如何使用Python进行数据可视化&#xff1a;Matplotlib和Seaborn指南 数据可视化是数据科学和分析中不可或缺的一部分&#xff0c;而Python中的Matplotlib和Seaborn库为用户提供了强大的工具来创建各种可视化图表。本文将介绍如何使用这两个库进行数据可视化&#xff0c;并提供…

数据结构与算法第八套试卷

1.建立一个长度为n的有序单链表的时间复杂度 0(n^2) 2.哈希算法 key%p&#xff1a;p最好为质数 如果两个关键字的值不等但哈希函数值相等&#xff0c;则称这两个关键字为同义词&#xff08;正确&#xff09;&#xff1b; 3.二分查找 注意&#xff1a; 二分查找是向下查询…

pytest生成allure的报告

首先要下载安装配置allure allure serve ./outputs/allure_report 可以生成html的文件自动在默认浏览器中打开

栈的应用——括号匹配

用栈实现 1、初始化一个栈&#xff0c;用来存左括号 2、遍历扫描括号字符串 如果遇到左括号&#xff0c;无脑入栈如果遇到右括号&#xff0c;此时栈空返回false&#xff0c;不空的话进行括号匹配。匹配不成功返回false&#xff0c;匹配成功将栈顶的那个左括号出栈。 遍历完之后…

Android Kotlin知识汇总(三)Kotlin 协程

Kotlin的重要优势及特点之——结构化并发 Kotlin 协程让异步代码像阻塞代码一样易于使用。协程可大幅简化后台任务管理&#xff0c;例如网络调用、本地数据访问等任务的管理。本主题介绍如何使用 Kotlin 协程解决以下问题&#xff0c;从而让您能够编写出更清晰、更简洁的应用代…

Selenium控制已运行的Edge和Chrome浏览器——在线控制 | 人机交互(详细启动步骤和bug记录)

文章目录 前期准备1. 浏览器开启远程控制指令&#xff08;1&#xff09;Edge&#xff08;2&#xff09;Chrome 2. 执行python代码&#xff08;1&#xff09;先启动浏览器后执行代码&#xff08;2&#xff09;通过代码启动浏览器&#xff08;3&#xff09;Bug问题记录1&#xff…

52 硬中断的实现

前言 呵呵 中断机制 也是内核中很常见的机制了 中断机制是现代计算机系统中的基本机制之一&#xff0c;它在系统中起着通信网络的作用&#xff0c;以协调系统对各种外部事件的响应和处理&#xff0c;中断是实现多道程序设计的必要条件&#xff0c;中断是CPU 对系统发生的某个…