首页 > 其他分享 >NET - DependencyInjection - Scrutor

NET - DependencyInjection - Scrutor

时间:2023-03-10 18:00:04浏览次数:29  
标签:Scan 程序 Scrutor 扫描 接口 注册 DependencyInjection NET

1 安装

1.1 命令

PM> NuGet\Install-Package Scrutor -Version 4.2.1

2 使用

2.1 装配扫描

Scrutor有两个针对服务集合 ServiceCollection 类的扩展方法:Scan Decorate

Scan方法用于扫描指定程序集,并按指定规则进行批量注册。

Decorate方法用于装饰已注册服务。

2.1.1 Scan

services.Scan(scan => scan
    .FromAssemblyOf<Program>() // 扫描 Program 类所在的程序集
    .AddClasses(
classes => classes.Where(
t => t.Name.EndsWith("Service", StringComparison.OrdinalIgnoreCase)
)
) // 筛选需要注册的类型 .AsImplementedInterfaces() // 暴露注册类型的接口为服务标识 .WithScopedLifetime()); // 指定生命周期模式为 Scoped

Scan 方法的参数是一个配置委托,在这个委托中一般需要定义四个东西:

  1. 选择程序集,选择要注册的服务类型在哪个程序集中,也就是要扫描哪个程序集,常用的有:
    1. FromAssemblyOf<>FromAssembliesOf扫描包含所提供的类型的程序集。

    2. FromCallingAssembly扫描调用该方法的程序集。

    3. FromExecutingAssembly扫描当前执行的程序集。

    4. FromEntryAssembly扫描入口程序集。

  2. 筛选注册类,筛选注册扫描程序集中的类型:
    1. AddClasses()添加所有公共的非抽象类。
    2. AddClasses(publicOnly)添加所有非抽象类,设置  publicOnly = false 可以添加  internal、private 修饰的类。
    3. AddClass(predicate)添加符合筛选条件的类。
    4. AddClasses(predicate, publicOnly)前面两种方法的结合。
  3. 暴露服务标识,注册类型应该以何种方式作为标识暴露:
    1. AsImplementedInterface()暴露实现类所有的接口。
    2. AsSelf()有时我们注册的类是没有实现接口的,所以也可以用自身作为标识暴露。
    3. AsMatchingInterface()大多数情况下,接口和实现类都会根据 IClass、Class 这样的习惯来命名,因此当我们需要暴露匹配类型名称的接口时,就可以使用该方法。
    4. As<>可以自由选择任何类型作为标识进行暴露。
  4. 生命周期,注册服务使用的生命周期模式:
    1. WithTransientLifetime()瞬时生命周期。
    2. WithScopedLifetime()作用域生命周期。
    3. WithSingletonLifetime()单例生命周期模式。

2.2 重复注册策略

有时候可能会出现重复注册的情况,也就是同一个服务,有多个不同的实现类。

因此注册过程有先后,所以这个时候可以利用 Scrutor 提供的重复注册处理策略:Append 、SkipThrowReplace

  1. Append 叠加注册,这是默认的策略,也就是所有实现类都注册,但默认情况只有最先注册的才会生效。
  2. Skip 跳过重复的注册服务,已注册的服务,不再为其注册其它实现类。
  3. Throw 抛弃已注册的接口,已注册的服务实现类将被抛弃,而是为该服务注册新的实现类。
  4. Replace 替换策略,它有三种替换方式:替换重复的实现类、替换重复的接口、替换任意重复。

 

标签:Scan,程序,Scrutor,扫描,接口,注册,DependencyInjection,NET
From: https://www.cnblogs.com/ShenhaoCore/p/17182139.html

相关文章

  • J4、ResNet与DenseNet结合探索
    ......
  • C# ASP.NET MVC 配置允许跨域访问
    在web.config文件中的system.webServer节点下增加如下配置<httpProtocol><customHeaders><addname="Access-Control-Allow-Origin"value="*"/>......
  • Windows Server 2012上安装.NET Framework 3.5
    1、打开服务器管理器 首先,打开服务器管理器,点击左侧的“仪表盘”,如下图所示。2、添加角色和功能点击上图中的“添加角色和功能”,弹出下图所示“添加角色和功能向导”......
  • ASP.NET Core - 配置系统之配置提供程序
    3.配置提供程序上面提到,通过IConfigurationBuilder的实现类对象,我们可以自由地往配置系统中添加不同的配置提供程序,从而获取不同来源的配置信息。.NETCore中,微软提供......
  • 如何在 Net6.0 中对 WebAPI 进行 JWT 认证和授权
    一、简介我们做微服务开发,或者说做分布式开发,有一项技术我们是避不开的,那就是WebAPI,在Net6.0中,有两类WebAPI,一类是极简WebAPI,它砍掉了很多冗余的东西,更纯粹的......
  • 如何在NET 6.0使用结构化的日志系统
     在我们的系统里面,有一项技术是必须使用的,那就是日志记录。我们在调试系统或者跟踪系统运行情况,都可以通过日志了解具体的情况。在项目开发中,我们有可能使用系统本身所带......
  • .net core 项目内网IP访问设置
     修改applicationhost.config文件夹,增加一条电脑IP访问地址(记得IP需要更换为自己电脑IP,端口和localhost相同)<bindings> <bindingprotocol="http"bindingInfo......
  • 09-应用层-DNS&FTP&Telnet
    1.应用层在前五章我们已经详细地讨论了计算机网络提供通信服务的过程。但是我们还没有讨论这些通信服务是如何提供给应用进程来使用的。本章讨论各种应用进程通过什么样......
  • .NET的RulesEngine(规则引擎)使用
    本文目录1、背景说明1.1规则引擎的使用场景1.2demo的代码说明2、演示2.1入门demo演示2.1.1代码展示2.1.2代码下载2.2规则参数说明2.2.1第一部分参数说明2.2.2第二......
  • netcore 上传文件
    一般上传文件可以用formdata的文件格式将你要上传的文件和其他参数放在一个类里面例如:publicclassuploadItemFile{publicintid{get;set;}publicF......