🍀优点
Autofac 通过反射程序集的方式来注册接口与实现之间的关系,带来的好处:
- 使用反射自动扫描并注册程序集中的所有类型,可以极大地减少手动编写注册代码的需要。这意呀着对于每个新的接口实现,你不需要更新一个集中的注册点,从而减少了出错的机会。
- 减少了样板代码,使得代码库更加干净和易于维护。
- 当你的项目增长,接口和实现的数量增加时,反射注册方式能够自动适应这些变化,而不需要你手动更新注册代码。
🍀案例:
🐳安装nuget包
首先我们要新建一个Asp.Net Core 的 Web API项目,在该项目中安装如下两个Nuget包
- Autofac:
- 这是Autofac框架的核心包,提供了依赖注入容器的基本功能。
- Autofac.Extensions.DependencyInjection:
- 这个包使得Autofac能够与ASP.NET Core的依赖注入系统无缝集成。
- 它提供了
AutofacServiceProviderFactory
等类,允许在ASP.NET Core应用程序中使用Autofac作为服务提供程序。
🐳创建接口与实现的程序集
在项目下新建接口与实现类的类库
接口
实现类
🐳创建AutofacModuleRegister
在api项目下新建AutofacModuleRegister 类,添加如下代码
这个 AutofacModuleRegister
类是一个自定义的 Autofac 模块,它继承自 Autofac.Module
基类。在 Autofac 中,模块(Module)是用来组织容器配置的一种方式,允许你将相关的注册逻辑分组在一起。这个特定的 AutofacModuleRegister
类通过重写 Load
方法来指定如何配置 Autofac 容器。
在 Load
方法中,执行以下操作:
- 加载程序集:
- 使用
Assembly.Load("Interface")
加载名为 "Interface" 的程序集。这通常是一个包含接口定义的程序集。 - 使用
Assembly.Load("Service")
加载名为 "Service" 的程序集。这通常是一个包含实现了 "Interface" 程序集中定义的接口的具体类的程序集。
- 注册类型:
- 调用
builder.RegisterAssemblyTypes(interfaceAssembly, serviceAssembly).AsImplementedInterfaces();
来注册这两个程序集中的类型。 -
RegisterAssemblyTypes
方法实际上只接受一个或多个程序集作为参数,并注册这些程序集中的类型。但在这个调用中,虽然传入了两个程序集,Autofac 会分别处理它们,而不是尝试在它们之间建立直接的接口与实现关系。 -
.AsImplementedInterfaces()
告诉 Autofac 对于RegisterAssemblyTypes
方法注册的每个类型,都将其实现的接口作为服务类型进行注册。
🐳 指定Autofac作为服务提供程序
指定Autofac作为服务提供程序,并配置Autofac容器以注册服务
在program中添加如下代码
🐳接口测试
然后我们就可以在控制器中通过构造函数形式注入我们的servic并使用
在swagger中测试一下我们的接口,可以成功获取到service返回的数据。