Asp.Net Core入门之自定义服务注册
谈到服务注册,首先我们先了解一下服务注册时使用的三种方式,也代表了不同的服务生命周期:
AddTransient AddScoped AddSingleton
AddSingleton生命周期最长,其生命周期范围描述为:从应用程序启动到应用程序结束。在第一次请求时会创建一个实例,之后的每次请求都会使用同一个实例。
AddTransient生命周期最短,在服务请求时会创建一个实例,服务请求结束生命周期即结束,之后的每一次请求都会创建不同的实例。
AddSingleton生命周期介于上述两者之间,这里用客户端请求会话的概念来描述比较清晰一点,它也是在服务请求时创建实例,但是在同一个会话周期内,之后的每次请求都会使用同一个实例,直至会话结束才会创建新的实例。
ASP.Net Core框架支持我们以如下方式注册我们自己的服务。
services.AddScoped<ITest, Test>();
其中第一个泛型类型(如:ITest)表示将要从容器中请求的类型(通常是一个接口)。第二个泛型类型(如:Test)表示将由容器实例化并且用于完成这些请求的具体实现类。
具体我们一起看下面的例子:
首先,我们创建一个需要实现查询功能的服务接口ITest
public interface ITest
{
Task<string> Get();
}
然后,我们创建功能类Test实现这个接口
public class Test : ITest
{
private readonly ILogger logger;
public Test(ILogger<Test> _logger)
{
logger = _logger;
}
public Task<string> Get()
{
logger.LogInformation("自定义服务查询");
return Task.FromResult("Hello World");
}
}
最后,我们需要我们自己的服务注册到容器中。
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<ITest, Test>();
}
以上我们便简单完成了自定义服务的注册。
随后我这里创建了一个Controller用以使用该服务。
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
//声明服务
private readonly ITest service;
/// <summary>
/// 通过构造函数的方式注入自定义服务类
/// </summary>
/// <param name="_service"></param>
public ValuesController(ITest _service)
{
service = _service;
}
/// <summary>
/// 调用服务中实现的Get方法
/// </summary>
/// <returns></returns>
[HttpGet]
public Task<string> Get()
{
return service.Get();
}
}
ASP.Net Core框架默认支持我们以构造函数的方式注入我们的服务以使用。
我想写到这里,大家也会有疑问,如果我们有很多service,这样一个个注册写起来代码很低效,这里我们简单给大家介绍一种批量注册的方式:
这里我们创建了一个批量注册服务派生类:
public static class ServiceExtensions
{
/// <summary>
/// 批量注册程序集下的服务类
/// </summary>
/// <param name="services"></param>
public static IServiceCollection AddBatchServices(this IServiceCollection services)
{
//根据指定程序集名称获取待注册服务
var batchServices = GetConfigureClass("WebApiApplication");
foreach (var type in batchServices)
{
type.Value.ToList().ForEach(i =>
{
//注册服务类
services.AddScoped(i, type.Key);
});
}
return services;
} /// <summary>
/// 根据程序集名称获取自定义服务
/// </summary>
/// <param name="assembly"></param>
/// <returns></returns>
public static Dictionary<Type, Type[]> GetConfigureClass(string assembly)
{
Dictionary<Type, Type[]> dic = new Dictionary<Type, Type[]>();
if (!string.IsNullOrEmpty(assembly))
{
//获取程序集对应的类型
Assembly dll = Assembly.LoadFrom(assembly);
List<Type> lstType = dll.GetTypes().ToList();
lstType.ForEach(x =>
{
//筛选满足条件的服务类
if (x.IsClass && x.GetInterfaces().Length > )
{
dic.Add(x, x.GetInterfaces());
}
});
}
return dic;
}
}
然后我们ConfigureServices方法中注册:
public void ConfigureServices(IServiceCollection services)
{
//批量注册
services.AddBatchServices();
}
对于批量注册,ASP.Net Core允许我们更换默认的IOC容器,感兴趣的同学可以试试AutoFac容器支持的程序集扫描式注册。
注册我们自己的服务,往往在项目开发过程中是必要的,希望以上简单的分享能给需要的小伙伴们带来一点收货。
Asp.Net Core入门之自定义服务注册的更多相关文章
- ASP.NET Core gRPC 使用 Consul 服务注册发现
一. 前言 gRPC 在当前最常见的应用就是在微服务场景中,所以不可避免的会有服务注册与发现问题,我们使用gRPC实现的服务可以使用 Consul 或者 etcd 作为服务注册与发现中心,本文主要介绍 ...
- Asp.Net Core入门之自定义中间件
什么是中间件? 这里引用官方解释: 中间件是用于组成应用程序管道来处理请求和响应的组件.管道内的每一个组件都可以选择是否将请求交给下一个组件.并在管道中调用下一个组件之前和之后执行某些操作.请求委托被 ...
- WebAPI调用笔记 ASP.NET CORE 学习之自定义异常处理 MySQL数据库查询优化建议 .NET操作XML文件之泛型集合的序列化与反序列化 Asp.Net Core 轻松学-多线程之Task快速上手 Asp.Net Core 轻松学-多线程之Task(补充)
WebAPI调用笔记 前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于 ...
- ASP.NET CORE 入门教程(附源码)
ASP.NET CORE 入门教程 第一课 基本概念 基本概念 Asp.Net Core Mvc是.NET Core平台下的一种Web应用开发框架 符合Web应用特点 .NET Core跨平台解决方案 ...
- ASP.NET 5 入门 (2) – 自定义配置
ASP.NET 5 入门 (2) – 自定义配置 ASP.NET 5 理解和入门 建立和开发ASP.NET 5 项目 初步理解ASP.NET5的配置 正如我的第一篇文章ASP.NET 5 (vNext ...
- CentOS开发ASP.NET Core入门教程
作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9891346.html 因为之前一直没怎么玩过CentOS,大多数时间都是使用Win10进行开发,然后程序 ...
- asp.net core 实现支持自定义 Content-Type
asp.net core 实现支持自定义 Content-Type Intro 我们最近有一个原本是内网的服务要上公网,在公网上有一层 Cloudflare 作为网站的公网流量提供者,CloudFla ...
- ASP.NET Core的路由[1]:注册URL模式与HttpHandler的映射关系
ASP.NET Core的路由是通过一个类型为RouterMiddleware的中间件来实现的.如果我们将最终处理HTTP请求的组件称为HttpHandler,那么RouterMiddleware中间 ...
- 在 ASP.NET Core 中执行租户服务
在 ASP.NET Core 中执行租户服务 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: http://gunna ...
随机推荐
- 14.5 Go 爬虫
14.5 Go 爬虫 爬虫库/框架 henrylee2cn/pholcus 幽灵蛛 星5200 gocrawl 星1700 colly 星7169 hu17889/go_spider 星1400 go ...
- EF Join连接查询的坑
最近做项目的时候遇到一个需要级联查询的数据,表中又没有定义相关的外键约束,所以限定了咱们只能使用Join方式的关联而不是Include的方式关联,关于Include和Join的详细用法,本屌就不再此处 ...
- Storm-Mongodb详解
这两天研究Trident,踩坑踩的遭不住,来和大家分享下. 首先写入数据库: 先看官方API给我们提供的方法: //这是用来辅助下面MongoInsert的简单实现类 public class Sim ...
- UVA10779 Collectors Problem
题目链接:https://cn.vjudge.net/problem/UVA-10779 前言: 本题是关于姜志豪<网络流的一些建模方法>的笔记. 知识点: 最大流 题意摘抄: \(Bob ...
- LightOJ1236
题目大意: 给你一个 n,请你找出共有多少对(i,j)满足 lcm(i,j) = n (i<=j) . 解题思路: 我们利用算术基本定理将 n,i,j 进行分解: n = P1a1 * P2a2 ...
- 模板:list列表显示
作为视图,担当的角色就是显示数据.所以关键就是,借助JSTL的c:forEach标签遍历从CategoryServlet的list()的request.setAttribute("thecs ...
- 深入理解Java虚拟机(1)
对于Java程序员,在虚拟机自动内存管理机制的帮助下,不需要再为每一个操作写配对的释放资源操作,不容易出现内存泄露和内存溢出问题.加深对Java虚拟机的理解,有助于在发现问题时精准定位问题,排 ...
- Elasticsearch系列---生产集群部署(上)
概要 本篇开始介绍Elasticsearch生产集群的搭建及相关参数的配置. ES集群的硬件特性 我们从开始编程就接触过各种各样的组件,而每种功能的组件,对硬件要求的特性都不太相同,有的需要很强的CP ...
- Java和NodeJS解析XML对比
Java解析XML 1.接收xml文件或者字符串,转为InputStream 2.使用DocumentBuilderFactory对象将InputStream转为document对象 Document ...
- Codeforces Round #646 (Div. 2)【C. Game On Leaves 题解】
题意分析 关于这道题,意思就是两个人摘叶子,谁最后摘到编号为x的谁就赢了.既然是叶子,说明其最多只有一个分支,由于题目上说了是无向图,那就是度数小于等于的节点.也就是一步步移除度数小于等于的节点,直到 ...