🍀优点 

Autofac 通过反射程序集的方式来注册接口与实现之间的关系,带来的好处:

  • 使用反射自动扫描并注册程序集中的所有类型,可以极大地减少手动编写注册代码的需要。这意呀着对于每个新的接口实现,你不需要更新一个集中的注册点,从而减少了出错的机会。
  • 减少了样板代码,使得代码库更加干净和易于维护。
  • 当你的项目增长,接口和实现的数量增加时,反射注册方式能够自动适应这些变化,而不需要你手动更新注册代码。

🍀案例:

🐳安装nuget包

首先我们要新建一个Asp.Net Core  的 Web API项目,在该项目中安装如下两个Nuget包

Autofac通过反射程序集方式 注册 接口 与 实现 之间的关系_提供程序

  1. Autofac
  • 这是Autofac框架的核心包,提供了依赖注入容器的基本功能。
  1. Autofac.Extensions.DependencyInjection
  • 这个包使得Autofac能够与ASP.NET Core的依赖注入系统无缝集成。
  • 它提供了AutofacServiceProviderFactory等类,允许在ASP.NET Core应用程序中使用Autofac作为服务提供程序。

🐳创建接口与实现的程序集

在项目下新建接口与实现类的类库

Autofac通过反射程序集方式 注册 接口 与 实现 之间的关系_程序集_02

接口

public interface IService
{
    string GetUser();
}
  • 1.
  • 2.
  • 3.
  • 4.

 实现类

public class Service :IService
{
    public string GetUser()
    {
        return "张三";
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

🐳创建AutofacModuleRegister 

 在api项目下新建AutofacModuleRegister 类,添加如下代码

public class AutofacModuleRegister : Autofac.Module
{
    //注册接口和实现之间的关系
    protected override void Load(ContainerBuilder builder)
    {
        //通过反射
        Assembly interfaceAssembly = Assembly.Load("Interface");
        Assembly serviceAssembly = Assembly.Load("Service");
        builder.RegisterAssemblyTypes(interfaceAssembly, serviceAssembly).AsImplementedInterfaces();
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

这个 AutofacModuleRegister 类是一个自定义的 Autofac 模块,它继承自 Autofac.Module 基类。在 Autofac 中,模块(Module)是用来组织容器配置的一种方式,允许你将相关的注册逻辑分组在一起。这个特定的 AutofacModuleRegister 类通过重写 Load 方法来指定如何配置 Autofac 容器。

在 Load 方法中,执行以下操作:

  1. 加载程序集
  • 使用 Assembly.Load("Interface") 加载名为 "Interface" 的程序集。这通常是一个包含接口定义的程序集。
  • 使用 Assembly.Load("Service") 加载名为 "Service" 的程序集。这通常是一个包含实现了 "Interface" 程序集中定义的接口的具体类的程序集。
  1. 注册类型
  • 调用 builder.RegisterAssemblyTypes(interfaceAssembly, serviceAssembly).AsImplementedInterfaces(); 来注册这两个程序集中的类型。
  • RegisterAssemblyTypes 方法实际上只接受一个或多个程序集作为参数,并注册这些程序集中的类型。但在这个调用中,虽然传入了两个程序集,Autofac 会分别处理它们,而不是尝试在它们之间建立直接的接口与实现关系。
  • .AsImplementedInterfaces() 告诉 Autofac 对于 RegisterAssemblyTypes 方法注册的每个类型,都将其实现的接口作为服务类型进行注册。

🐳 指定Autofac作为服务提供程序

指定Autofac作为服务提供程序,并配置Autofac容器以注册服务

在program中添加如下代码 

Autofac通过反射程序集方式 注册 接口 与 实现 之间的关系_autofac_03

// 使用 Autofac 作为服务提供程序  
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
// 配置 Autofac 容器  
builder.Host.ConfigureContainer<ContainerBuilder>(builder =>
{
    //注册接口和实现层
    builder.RegisterModule(new AutofacModuleRegister());
});
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

🐳接口测试

然后我们就可以在控制器中通过构造函数形式注入我们的servic并使用

[Route("api/[controller]/[action]")]
[ApiController]
public class TestController : ControllerBase
{
    private readonly IService _service;

    public TestController(IService service)
    {
        _service = service;
    }

    [HttpGet]
    public string get()
    {
       return _service.GetUser();
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

在swagger中测试一下我们的接口,可以成功获取到service返回的数据。

Autofac通过反射程序集方式 注册 接口 与 实现 之间的关系_autofac_04