我们在开发.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);
}
来看看效果:
成功注入,这样就完成了全部代码的编写,官方其实也很强大,很简单吧。大家自己可以尝试一下。