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

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:<https://github.com/khellang/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

目录
相关文章
|
2月前
|
开发框架 .NET 程序员
驾驭Autofac,ASP.NET WebApi实现依赖注入详细步骤总结
Autofac 是一个轻量级的依赖注入框架,专门为 .NET 应用程序量身定做,它就像是你代码中的 "魔法师",用它来管理对象的生命周期,让你的代码更加模块化、易于测试和维护
驾驭Autofac,ASP.NET WebApi实现依赖注入详细步骤总结
|
2月前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
50 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
1月前
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
33 3
|
16天前
|
开发框架 算法 中间件
ASP.NET Core 中的速率限制中间件
在ASP.NET Core中,速率限制中间件用于控制客户端请求速率,防止服务器过载并提高安全性。通过`AddRateLimiter`注册服务,并配置不同策略如固定窗口、滑动窗口、令牌桶和并发限制。这些策略可在全局、控制器或动作级别应用,支持自定义响应处理。使用中间件`UseRateLimiter`启用限流功能,并可通过属性禁用特定控制器或动作的限流。这有助于有效保护API免受滥用和过载。 欢迎关注我的公众号:Net分享 (239字符)
34 0
|
3月前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
4月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
53 7
|
4月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
91 0
|
5月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
71 0
|
5月前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
|
5月前
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
166 0

热门文章

最新文章