.NET Core/.NET5内置的依赖注入DI扩展 Scrutor

我们在开发.NET时候通常如果没有特殊要求内置依赖注(DI)入基本能满足大多数注入,但内置的DI无法做到批量注入,如果用第三方注入框架(比如AutoFac)使用比较复杂,那么这时候可以使用.NET 内部DI扩展框架Scrutor。Scrutor 并不是一个依赖注入框架,而是 ASP.NET Core 内置依赖注入框架的一个扩展。接下来我看看如何使用Scrutor。.

一、环境配置

这里我们以asp.net core MVC为例,创建一个空MVC项目。最好选择.net core 3.1以上版本,.NET6与其他版本有所不同,这里以.NET5为例。

安装方法比较简单,可以用nuget命令提示符或者在“nuget包管理器”里搜索安装。命令提示如下:

Install-Package Scrutor # or dotnet add package Scrutor

安装成功后会在包目录下看到“Scrutor”

二、在项目中使用Scrutor    

1、首先新建一个customer项目的接口、服务类 Service作为注入对象。代码如下

namespace cutomer_scrutor{    public interface ICustomerService    {        public string Name { get; set; }    }    public class CustomerService : ICustomerService    {        public string Name { get; set; }        public CustomerService()        {            Name = "Hello Customer";        }    }}

2、在startup 类ConfigureServices 方法中使用,代码如下:

 public void ConfigureServices(IServiceCollection services)        {            services.AddControllersWithViews();            services.Scan(selector => selector //加载startup 类所在的程序集               .FromAssemblyOf<Startup>()               //过滤程序集中需要注册的类,这个可以添加多个Class               .AddClasses(classes => classes.Where(t => t.Name.EndsWith("Service")))               //.AddClasses(classes => classes.Where(t => t.Name.EndsWith("Pro")))               .AsMatchingInterface()//暴露匹配的接口               //这里我使用的AsMatchingInterface()相当于services.AddSingleton<IClassName, ClassName>();。               //.AsImplementedInterfaces() //暴露的是每一个接口               //.As(t => t.GetInterfaces()) //暴露所有接口               //.AsSelf() //暴露自己,因为是单一类型,没有接口               //设置重复注册服务的替换策略               .UsingRegistrationStrategy(RegistrationStrategy.Throw)               .WithScopedLifetime()//设置生命周期,可以设置单例,作用域,瞬时               );        }

在.NET6中由于没有Startup文件,我们需要在Program启动文件里注入,如下。

var builder = WebApplication.CreateBuilder(args);// Add services to the container.builder.Services.Scan(selector => selector             .FromAssemblyOf<Program>()             .AddClasses(classes => classes.Where(t => t.Name.EndsWith("Service")))             .AsMatchingInterface()             .WithScopedLifetime());

3、在控制器中调用,这里我们采用构造函数调用。

private readonly ICustomerService customerService;public HomeController(ICustomerService _customerService){     customerService = _customerService;}public IActionResult Index(){    string rel= customerService.Name;    return Content(rel);}

来看看效果:

.NET Core/.NET5内置的依赖注入DI扩展 Scrutor

成功注入,这样就完成了全部代码的编写,官方其实也很强大,很简单吧。大家自己可以尝试一下。