Asp.Net Core入门之自定义服务注册
2024-09-01 19:17:32
谈到服务注册,首先我们先了解一下服务注册时使用的三种方式,也代表了不同的服务生命周期:
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容器支持的程序集扫描式注册。
注册我们自己的服务,往往在项目开发过程中是必要的,希望以上简单的分享能给需要的小伙伴们带来一点收货。
最新文章
- .Net 跨平台可移植类库正在进行
- GPS部标平台的架构设计(一)
- leetcode23 多个拍好序的链表进行归并排序 (java版本)
- iOS弹框
- Google账户无法登陆-Solved
- C#扫盲之:带你掌握C#的扩展方法、以及探讨扩展方法的本质、注意事项
- Xamarin相关学习预估
- Composite Design Pattern 设计模式组合
- 给RelativeLayout设置背景,无效果bug解决
- [JSOI2007]建筑抢修
- 【Android 应用开发】 Fragment 详解
- Vue生命周期中mounted和created的区别
- python+unnitest时运行后不执行main函数里面的内容
- go 单元测试时读取配置文件
- Centos 6.9下部署Oracle 11G数据库环境的操作记录
- Swift中String与NSDate的互相转换
- ysql怎么处理百分数? “%”
- C# 大图片压缩算法,减少图片体积
- L1-001 Hello World
- linux文件属性介绍
热门文章
- AJAX二
- DPDK Hash Library原理(学习笔记)
- 委托 事件 observer
- 如何覆盖elementUI样式
- .net core HttpClient 使用之消息管道解析(二)
- eclipse——Error exists in required project Proceed with launch?
- 织梦DEDECMS网站如何生成xml格式网站地图
- 【Ubuntu】快捷键
- [批处理教程之Shell]002.Linux 常用命令大全
- Excel表格中无法中间插入新行列! 提示:在当前工作表的最后一行或列中,存在非空单元格,解决方案