简化 ASP.NET Core 依赖注入(DI)注册-Scrutor

Scrutor 是一个开源库,旨在简化 ASP.NET Core 应用程序中依赖注入(DI)的注册过程。通过自动扫描程序集中的类型并根据提供的规则自动注册服务。

基本使用

使用 NuGet 包管理器安装:

dotnet add package Scrutor

步骤

  • 选择器(Selector):指定要注册的服务实现。
  • 注册策略(Registration Strategy):处理重复服务的策略。
  • 服务(Services):指定服务的具体实现。
  • 生命周期(Lifetime):服务的生命周期,如 Singleton、Scoped、Transient。
  1. 选择程序集:指定从哪个程序集中扫描类型。
services.Scan(scan => scan
.FromAssemblyOf<MyClass>(); // 从包含MyClass的程序集中扫描
  1. 添加类:过滤需要注册的类。
services.Scan(scan => scan
.FromAssemblyOf<MyClass>()
.AddClasses(classes => classes.Where(t => t.Name.EndsWith("Service"))); // 只注册以Service结尾的类
  1. 指定注册方式:指定类应该注册为哪些接口。
services.Scan(scan => scan
.FromAssemblyOf<MyClass>()
.AddClasses(classes => classes.Where(t => t.Name.EndsWith("Service")))
.AsImplementedInterfaces(); // 注册为实现的所有接口
  1. 设置生命周期:为注册的服务设置生命周期。
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的更多相关文章

  1. ASP.NET Core依赖注入(DI)

    ASP.NET Core允许我们指定注册服务的生存期.服务实例将根据指定的生存时间自动处理.因此,我们无需担心清理此依赖关系,他将由ASP.NET Core框架处理.有如下三种类型的生命周期. 关于依 ...

  2. ASP.NET Core 依赖注入(DI)

    ASP.NET Core的底层设计支持和使用依赖注入.ASP.NET Core 应用程序可以利用内置的框架服务将服务注入到启动类的方法中,并且应用程序服务也可以配置注入.由ASP.NET Core 提 ...

  3. ASP.NET Core - 依赖注入(二)

    .NET Core 依赖注入的基本用法 话接上篇,这一章介绍 .NET Core 框架自带的轻量级 Ioc 容器下服务使用的一些知识点,大家可以先看看上一篇文章 [ASP.NET Core - 依赖注 ...

  4. # ASP.NET Core依赖注入解读&使用Autofac替代实现

    标签: 依赖注入 Autofac ASPNETCore ASP.NET Core依赖注入解读&使用Autofac替代实现 1. 前言 2. ASP.NET Core 中的DI方式 3. Aut ...

  5. [译]ASP.NET Core依赖注入深入讨论

    原文链接:ASP.NET Core Dependency Injection Deep Dive - Joonas W's blog 这篇文章我们来深入探讨ASP.NET Core.MVC Core中 ...

  6. ASP.NET Core依赖注入——依赖注入最佳实践

    在这篇文章中,我们将深入研究.NET Core和ASP.NET Core MVC中的依赖注入,将介绍几乎所有可能的选项,依赖注入是ASP.Net Core的核心,我将分享在ASP.Net Core应用 ...

  7. ASP.NET Core 依赖注入最佳实践——提示与技巧

    在这篇文章,我将分享一些在ASP.NET Core程序中使用依赖注入的个人经验和建议.这些原则背后的动机如下: 高效地设计服务和它们的依赖. 预防多线程问题. 预防内存泄漏. 预防潜在的BUG. 这篇 ...

  8. ASP.NET Core依赖注入最佳实践,提示&技巧

    分享翻译一篇Abp框架作者(Halil İbrahim Kalkan)关于ASP.NET Core依赖注入的博文. 在本文中,我将分享我在ASP.NET Core应用程序中使用依赖注入的经验和建议. ...

  9. ASP.NET Core依赖注入解读&使用Autofac替代实现【转载】

    ASP.NET Core依赖注入解读&使用Autofac替代实现 1. 前言 2. ASP.NET Core 中的DI方式 3. Autofac实现和自定义实现扩展方法 3.1 安装Autof ...

  10. ASP.NET Core 依赖注入基本用法

    ASP.NET Core 依赖注入 ASP.NET Core从框架层对依赖注入提供支持.也就是说,如果你不了解依赖注入,将很难适应 ASP.NET Core的开发模式.本文将介绍依赖注入的基本概念,并 ...

随机推荐

  1. WaterCloud:一套基于.NET 8.0 + LayUI的快速开发框架,完全开源免费!

    前言 今天大姚给大家分享一套基于.NET 8.0 + LayUI的快速开发框架,项目完全开源.免费(MIT License)且开箱即用:WaterCloud. 可完全实现二次开发让开发更多关注业务逻辑 ...

  2. PS安装插件提示无法加载扩展未正确签署 的解决办法

    PS安装插件提示无法加载扩展未正确签署解决方式 win系统: 1.打开"运行"窗口(点击电脑左下角"开始"菜单,从打开的菜单中依次点击"所有程序&qu ...

  3. Android Qcom USB Driver学习(十四)

    UDC-Gadget UDC:(USB Device Controller)用于管理和控制USB设备与主机之间的通信. Gadget:Android在此层实现了adb,mtp(Media Transf ...

  4. window10任务栏图标不见了(如何修复)

    1.按 Windows键+ R 2.写 %temp% 在其中,然后单击"确定". 3.删除其中的所有内容以清除临时文件. 4.重启

  5. kotlin更多语言结构——>操作符重载

    Kotlin允许我们为自己的类型提供预定义的一组操作符的实现.这些操作符具有固定的符号表示(如 + 或 *) 和固定的优先级.为实现这样的操作符,我们为相应的类型(即二元操作符左侧的类型和一元操作符的 ...

  6. NebulaGraph 的云产品交付实践

    作者:乔雷,Vesoft.Inc 云原生技术专家 NebulaGraph 介绍 NebulaGraph 是由杭州悦数科技有限公司自主研发的一款开源分布式图数据库产品,擅长处理千亿节点万亿条边的超大数据 ...

  7. Effective C++:把C++看作一个语言联邦

    C++曾经是从C with class发展而来的,但是现在随着异常.模板.STL等等的发展,C++已变得相当的多样与庞大,这一方面让C++功能强大无比的多重范式语言,上天入地无所不能:另一方面,也给学 ...

  8. AWS-最佳实践-杂信息

    1.Amazon Aurora Serverless v1 AmazonAurora-Serverless版本1是亚马逊Aurora的按需自动缩放配置.Aurora Serverlessv1 DB集群 ...

  9. Python实现杨辉三角(字节实习面试题)

    2021-06-29 问题描述 杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数. 它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加. 下面给出了杨辉三角形的前 ...

  10. MISC 高手进阶区 1-5

    1.reverseME 题目描述 无 附件 一个 .jpg 的图片 是一个flag字符串的图片镜像. reverse V-T If you reverse the order of a set of ...