简化 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. 面试官的几句话,差点让我挂在HTTPS上

    作为软件测试,大家都知道一些常用的网络协议是我们必须要了解和掌握的,比如 HTTP 协议,HTTPS 协议就是两个使用非常广泛的协议,所以也是面试官问的面试的时候问的比较多的两个协议:而且因为这两个协 ...

  2. MySQL 用户、权限管理,C/C++连接与使用

    目录 用户 用户管理 查询所有用户 查看当前用户 查看当前连接数 创建用户 删除用户 修改密码规则 查看规则/策略 规则说明 临时设置 持久设置 修改密码 权限 数据库提供的 权限列表 查看权限 给用 ...

  3. ROS基础入门——实操教程

    ROS基础入门--实操教程 前言 本教程实操为主,少说书.可供参考的文档中详细的记录了ROS的实操和理论,只是过于详细繁杂了,看得脑壳疼,于是做了这个笔记. Ruby Rose,放在这里相当合理 前言 ...

  4. mmap映射类型

    文件映射和匿名映射都是操作系统中对于内存映射的两种类型,主要应用于进程间的通信或者大量数据的处理. 文件映射,也就是内存映射文件,是把一个文件或者文件的一部分映射到进程的地址空间,它允许对文件进行随机 ...

  5. 《An Image Patch is a Wave: Phase-Aware Vision MLP》结构图+个人做的验证实验

    今天阅读了<An Image Patch is a Wave: Phase-Aware Vision MLP>这篇论文,根据代码绘制的它的结构图.如果有错误,还请指正. Wave_MLP_ ...

  6. Java日期时间API系列23-----Jdk8中java.time包中的新的日期时间API类,获取准确开始时间00:00:00,获取准确结束时间23:59:59等

    有时候,往往需要统计某个时间区间的销量等问题,这就需要准确的起始时间,获取准确开始时间00:00:00,获取准确结束时间23:59:59.下面增加了一一些方法,获取当天起始时间,昨天起始时间,当前月第 ...

  7. 泛型dotnet

    // 什么是泛型List<T> T:表示类型参数,指代任意类型 T可以是任意标识 // 编写代码时使用特殊符号替代位置类型,在实例化或使用/调用时才会进行具体类型的定义 // 特点:重用代 ...

  8. vuex 基本代码规范 js 文件

    import Vue from "vue"; import Vuex from "vuex"; import { setItem, getItem } from ...

  9. 从零开始学机器学习——构建一个推荐web应用

    首先给大家介绍一个很好用的学习地址:https://cloudstudio.net/columns 今天,我们终于将分类器这一章节学习完活了,和回归一样,最后一章节用来构建web应用程序,我们会回顾之 ...

  10. Java 当中使用 “google.zxing ”开源项目 和 “github 的 qrcode-plugin” 开源项目 生成二维码

    Java 当中使用 "google.zxing "开源项目 和 "github 的 qrcode-plugin" 开源项目 生成二维码 @ 目录 Java 当中 ...