前言:要实现自动扫描依赖注入,我们要先安装下面这两个nuget包
Autofac
Autofac.Extensions.DependencyInjection
- 新建两个文件夹IService用于存放接口,里面存放有IEnd和IOperation两个接口类,Service用于存放实现类,存放有End和Operation两个实现类,我们要做的是自动依赖注入服务,自动让IEnd和End对应
- 在Program.cs文件写入以下代码
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
builder.Host.ConfigureContainer<ContainerBuilder>(builder =>
{
//builder.RegisterModule<AutofacModule>();
var assemblies = Assembly.GetExecutingAssembly();
builder.RegisterAssemblyTypes(assemblies)//程序集内所有具象类
.Where(c => c.Name.EndsWith("Service"))
.PublicOnly()//只要public访问权限的
.Where(cc => cc.IsClass)//只要class型(主要为了排除值和interface类型)
.AsImplementedInterfaces();
});
我来解析代码意思,下面这段代码的意思是,选择具有名称以 “Service” 结尾的类,并且它们必须是 public 访问权限的类,并且必须是 Class 类型的。然后,将这些类注册为它们实现的所有接口。
.Where(c => c.Name.EndsWith("Service"))
.PublicOnly()
.Where(cc => cc.IsClass)
.AsImplementedInterfaces();
.AsImplementedInterfaces() 方法会将每个选定的类注册为它们实现的所有接口。
具体来说,在这段代码中,当我们选定一个类时,.AsImplementedInterfaces() 方法会检查这个类实现了哪些接口,并将其注册为这些接口。
例如,如果我们有一个名为 UserService 的类,它实现了 IUserService 接口,那么在调用 .AsImplementedInterfaces() 方法时,Autofac会将 UserService 类注册为 IUserService 接口的实现。
因此,Autofac会根据类所实现的接口来找到对应的接口,并将这些接口作为类的服务注册到容器中。
#前面两步已经完成了自动扫描程序集批量依赖注入,下面是验证
验证:
- 在IService接口随便写一个方法,在Service实现该方法
在控制器用构造函数初始化,然后调用该方法
运行成功