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 ...
随机推荐
- Excel导出到DataSet
#region 导入excel 返回Dataset public DataSet ExecleDataSet(string filename, string file, string Type) { ...
- 依赖工程开发,编译报错Command Libtool failed with a nonzero exit code
升级AFN之后,SDK工程始终编译不通过找不到SDK.a 原因在SDK Target ->Build phases ->Link Binary With Libraries 多添加了SDK ...
- Java——分布式
分布式编程技术的基本思想:客户计算机产生一个请求,然后将这个请求通过网络发送到服务器.服务器处理这个请求,并发送回一个针对该客户端的响应,供客户端进行分析.客户端和服务端之间用代理进行通讯,客户端调用 ...
- 查看包名和Activity的小工具
添加到右键菜单,很方便. 做个记录:请移步原文
- Java8中的Lambda表达式
Lambda是什么 Lambda表达式,也可称为闭包,是java8的新特性,作用是取代大部分内部类,优化java代码结构,让代码变得更加简洁紧凑. Lambda的基本语法 (expression)-& ...
- [JavaWeb基础] 032.第三方插件pinyin4j的使用
突然发现了一个比较新奇的插件,就是可以把我们输入的汉字,输出它所有的拼音的jar包.下面以代码的形式简单的介绍下这个插件 package com.babybus.sdteam.pinyin4j; im ...
- [Python基础]004.语法(3)
语法(3) 方法 定义 调用 参数 返回 模块 引入模块 写模块 模块名称 dir() 方法 定义 语法 def 方法名(参数): 返回值 return 没有指定返回值的方法,默认返回空值 None ...
- 读Pyqt4教程,带你入门Pyqt4 _007
QSlider 滑块是由一个简单的滑柄的窗口组件.该滑柄可以前后拖动,通过这种方式我们可以为特定任务选择值.有时候使用滑块比简单提供数值或使用微调框(spin box)更自然. QLabel 显示文字 ...
- Could not find the Qt platform plugin windows错误解决方法
在PyCharm中运行PyQt5窗口程序时,出现了下图所有的错误提示. 出现该问题的原因是环境变量没有添加. 解决方法:在环境变量中增加:QT_QPA_PLATFORM_PLUGIN_PATH 路径: ...
- R语言入门二
一.R语言应知常用函数 1.getwd() 函数:获取工作目录(同eclipse设置workspace类似),直接在R软件中使用,如下图: 2.setwd(dir=”工作目录”) 函数:设置R软件RS ...