简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个开源库,旨在简化 ASP.NET Core 应用程序中依赖注入(DI)的注册过程。通过自动扫描程序集中的类型并根据提供的规则自动注册服务。
基本使用
使用 NuGet 包管理器安装:
dotnet add package Scrutor
步骤
- 选择器(Selector):指定要注册的服务实现。
- 注册策略(Registration Strategy):处理重复服务的策略。
- 服务(Services):指定服务的具体实现。
- 生命周期(Lifetime):服务的生命周期,如 Singleton、Scoped、Transient。
- 选择程序集:指定从哪个程序集中扫描类型。
services.Scan(scan => scan
.FromAssemblyOf<MyClass>(); // 从包含MyClass的程序集中扫描
- 添加类:过滤需要注册的类。
services.Scan(scan => scan
.FromAssemblyOf<MyClass>()
.AddClasses(classes => classes.Where(t => t.Name.EndsWith("Service"))); // 只注册以Service结尾的类
- 指定注册方式:指定类应该注册为哪些接口。
services.Scan(scan => scan
.FromAssemblyOf<MyClass>()
.AddClasses(classes => classes.Where(t => t.Name.EndsWith("Service")))
.AsImplementedInterfaces(); // 注册为实现的所有接口
- 设置生命周期:为注册的服务设置生命周期。
services.Scan(scan => scan
.FromAssemblyOf<MyClass>()
.AddClasses(classes => classes.Where(t => t.Name.EndsWith("Service")))
.AsImplementedInterfaces()
.WithScopedLifetime(); // 设置为Scoped生命周期
进阶使用
进行服务扫描(Scanning)
- FromAssemblyOf()从包含指定类型
T的程序集中扫描服务。 - FromAssembliesOf(params Type[] types)可以指定多个类型,Scrutor 将扫描包含这些类型的所有程序集。
- FromCallingAssembly()扫描调用
Scan方法的程序集。 - FromExecutingAssembly()扫描正在执行
Scan方法的程序集。 - FromEntryAssembly()扫描应用程序的入口程序集(通常是包含
Main方法的程序集)。 - 等等...
进行服务装饰(Decoration)
服务装饰是一种在不改变现有服务实现的情况下,动态地为服务添加额外功能的技术。
使用案例
装饰器模式,允许你在不修改现有类的情况下为服务添加行为。例如,为 IMessageSender 接口添加一个记录日志的装饰器:
public interface IMessageSender
{
void SendMessage(string message);
}
public class EmailMessageSender : IMessageSender
{
public void SendMessage(string message)
{
Console.WriteLine($"Sending email: {message}");
}
}
public class LoggingMessageSender : IMessageSender
{
private readonly IMessageSender _inner;
public LoggingMessageSender(IMessageSender inner)
{
_inner = inner;
}
public void SendMessage(string message)
{
Console.WriteLine("Starting to send message...");
_inner.SendMessage(message);
Console.WriteLine("Message sent successfully.");
}
}
// 使用 Scrutor 注册服务和装饰器
services.Scan(scan => scan
.FromAssemblyOf<IMessageSender>()
.AddClasses(classes => classes.AssignableTo<IMessageSender>())
.AsImplementedInterfaces()
.WithTransientLifetime());
services.Decorate<IMessageSender, LoggingMessageSender>();
生命周期管理
想要为特定服务设置不同的生命周期,可以链式调用不同的生命周期设置
services.Scan(scan => scan
.FromAssemblyOf<CombinedService>()
.AddClasses(classes => classes.AssignableTo<ICombinedService>()) // 过滤服务
.AsSelfWithInterfaces() // 注册为接口
.WithSingletonLifetime()) // 设置为 Singleton 生命周期
// 对于其他服务,设置 Scoped 生命周期
.AddClasses(x => x.AssignableTo(typeof(IOpenGeneric<>))) // 可以关闭泛型类型
.AsMatchingInterface()
.WithScopedLifetime(); // 设置为 Scoped 生命周期
多重过滤
services.Scan(scan => scan
.FromAssemblyOf<MyService>()
.AddClasses()
.UsingRegistrationStrategy(RegistrationStrategy.Skip) // 如果服务已存在,则跳过注册
.AsSelf()
.WithTransientLifetime());
链式注册
Scrutor 允许你将多个扫描整合成一个调用链,为不同的类应用不同的规则子集:
services.Scan(scan => scan
.FromAssemblyOf<Startup>()
.AddClasses(classes => classes.Where(t => t.Name.EndsWith("Repository")))
.AsImplementedInterfaces()
.WithTransientLifetime()
.AddClasses(classes => classes.Where(t => t.Name.EndsWith("Service")))
.AsImplementedInterfaces()
.WithScopedLifetime());
总结
Scrutor 在实际项目中简化依赖注入的配置工作,特别是在大型项目中,提供了灵活的扫描和注册机制,使得服务注册更加简洁和可维护。
欢迎关注我的公众号“Net分享”,技术文章第一时间推送,随缘更新 , 分享一些你可能注意不到的细节。
仓库地址:https://github.com/khellang/Scrutor
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor的更多相关文章
- ASP.NET Core依赖注入(DI)
ASP.NET Core允许我们指定注册服务的生存期.服务实例将根据指定的生存时间自动处理.因此,我们无需担心清理此依赖关系,他将由ASP.NET Core框架处理.有如下三种类型的生命周期. 关于依 ...
- ASP.NET Core 依赖注入(DI)
ASP.NET Core的底层设计支持和使用依赖注入.ASP.NET Core 应用程序可以利用内置的框架服务将服务注入到启动类的方法中,并且应用程序服务也可以配置注入.由ASP.NET Core 提 ...
- ASP.NET Core - 依赖注入(二)
.NET Core 依赖注入的基本用法 话接上篇,这一章介绍 .NET Core 框架自带的轻量级 Ioc 容器下服务使用的一些知识点,大家可以先看看上一篇文章 [ASP.NET Core - 依赖注 ...
- # ASP.NET Core依赖注入解读&使用Autofac替代实现
标签: 依赖注入 Autofac ASPNETCore ASP.NET Core依赖注入解读&使用Autofac替代实现 1. 前言 2. ASP.NET Core 中的DI方式 3. Aut ...
- [译]ASP.NET Core依赖注入深入讨论
原文链接:ASP.NET Core Dependency Injection Deep Dive - Joonas W's blog 这篇文章我们来深入探讨ASP.NET Core.MVC Core中 ...
- ASP.NET Core依赖注入——依赖注入最佳实践
在这篇文章中,我们将深入研究.NET Core和ASP.NET Core MVC中的依赖注入,将介绍几乎所有可能的选项,依赖注入是ASP.Net Core的核心,我将分享在ASP.Net Core应用 ...
- ASP.NET Core 依赖注入最佳实践——提示与技巧
在这篇文章,我将分享一些在ASP.NET Core程序中使用依赖注入的个人经验和建议.这些原则背后的动机如下: 高效地设计服务和它们的依赖. 预防多线程问题. 预防内存泄漏. 预防潜在的BUG. 这篇 ...
- ASP.NET Core依赖注入最佳实践,提示&技巧
分享翻译一篇Abp框架作者(Halil İbrahim Kalkan)关于ASP.NET Core依赖注入的博文. 在本文中,我将分享我在ASP.NET Core应用程序中使用依赖注入的经验和建议. ...
- ASP.NET Core依赖注入解读&使用Autofac替代实现【转载】
ASP.NET Core依赖注入解读&使用Autofac替代实现 1. 前言 2. ASP.NET Core 中的DI方式 3. Autofac实现和自定义实现扩展方法 3.1 安装Autof ...
- ASP.NET Core 依赖注入基本用法
ASP.NET Core 依赖注入 ASP.NET Core从框架层对依赖注入提供支持.也就是说,如果你不了解依赖注入,将很难适应 ASP.NET Core的开发模式.本文将介绍依赖注入的基本概念,并 ...
随机推荐
- 蓝桥杯-全球变暖 (DFS)
你有一张某海域NxN像素的照片,"."表示海洋."#"表示陆地,如下所示: ....... .##.... .##.... ....##. ..####. .. ...
- MySQL服务无法启动 服务没有报告任何错误
安装MYSQL后 启动服务 出现错误 在启动MySQL服务时 出现该报错 解决方法: 将原本在MySQL根目录下的my.ini文件移动到bin目录下(my.ini文件参考:这里) 删除根目录下的 ...
- 1 月 25 日见|Flutter Forward 活动日程表正式发布!
2023 年 1 月 25 日 (正月初四),我们将在肯尼亚首都内罗毕举办 Flutter Forward 大会,并同时开启线上直播.本次活动将展示最新的 Flutter 技术更新,包括一个主题演讲以 ...
- 打开word报错“内存或磁盘空间不足,无法显示所请求的字体”
起因: 有一个部门同学在打开服务器上的某个word文档时报错,但是打开本地word文档正常,经过网上查询资料后发现有可能是以下几种原因造成. 可能造成此报错的原因: 1. 文档被锁定 解决办法: 鼠标 ...
- linux tracepoint增加
引入tracepoint的背景 当需要获取内核的debug信息时,通常你会通过以下printk的方式打印信息: void trace_func() { //-- printk("输出信息&q ...
- uprobe
本章的我们来学习uprobe ,顾名思义,相对于内核函数/地址的监控,主要用于用户态函数/地址的监控.听起来是不是有点神奇,内核怎么监控用户态函数的调用呢?本章的内容包括: 如何使用uprobe 内核 ...
- 第三方的开源库FluentVaidation校验字段的
内置的 using System.ComponentModel.DataAnnotations; 基本使用: 1. 安装包 FluentValidation.AspNetCOre 2. 注册服务 bu ...
- webpack的构建流程是什么?从读取配置到输出文件这个过程尽量说全
webpack 的运行流程是一个串行的流程,从启动到结束会依次执行以下步骤 : 1. 初始化参数:在配置文件,读取并合并参数,得到最终的参数 : 2. 开始编译:拿着上一步的参数初始化 Compile ...
- k8s的pod的理解
pod共享相同的IP地址和端口空间. 这意味着在同一 pod中的容器运行的 多个进程需要注意不能绑定到相同的端口号, 否则会导致端口冲突, 但这只涉及同一pod中的容器. 由于每个pod都有独立的端口 ...
- ES6语法特性
ES6语法特性 简介 ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了. 它的目标,是使得 JavaScript 语言 ...