我们在开发.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# ordotnet 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);}
来看看效果:

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