使用Autofac实现依赖注入

一、使用Autofac实现一次性对程序集中类的依赖注入

1.导入autofac包10.0.0版本

<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="8.0.0" />

2.配置需要注册服务的程序集的文件

public class AutofacModuleRegister : Autofac.Module
{

  protected override void Load(ContainerBuilder builder)
  {
    var basePath = AppContext.BaseDirectory;

    var serviceDllFile = Path.Combine(basePath, "BCVP.Net8.Service.dll");
    var repositoryDllFile = Path.Combine(basePath, "BCVP.Net8.Repository.dll");

    // 注册服务
    builder.RegisterGeneric(typeof(BaseRepository<>)).As(typeof(IBaseRepository<>)).InstancePerDependency();
    builder.RegisterGeneric(typeof(BaseService<,>)).As(typeof(IBaseService<,>)).InstancePerDependency();

    //  获取Service.dll 程序集服务,并注册
    var assemblysService = Assembly.LoadFrom(serviceDllFile);
    builder.RegisterAssemblyTypes(assemblysService)
        .AsImplementedInterfaces()
        .PropertiesAutowired()
        .InstancePerDependency();

    // 获取Repository.dll 程序集服务,并注册
    var assemblysRepository = Assembly.LoadFrom(repositoryDllFile);
    builder.RegisterAssemblyTypes(assemblysService)
        .AsImplementedInterfaces()
        .PropertiesAutowired()
        .InstancePerDependency();
  }
}

3.在webpai的program.cs文件中注册AutofacModuleRegister
image

// 使用Autofac实现程序集依赖注入
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureContainer<ContainerBuilder>(builder =>
{
    builder.RegisterModule<AutofacModuleRegister>();
    builder.RegisterModule<AutofacPropertityModuleReg>();
});

4.使用通过autofac对程序集中的类进行依赖注入
image

private readonly ILogger<WeatherForecastController> _logger;
private readonly IMapper _mapper;
private readonly IBaseService<Role, RoleVo> _roleService;

public WeatherForecastController(ILogger<WeatherForecastController> logger,
IMapper mapper,
IBaseService<Role, RoleVo> roleService)
{
  _logger = logger;
  _mapper = mapper;
  _roleService = roleService;
}

[HttpGet(Name = "GetWeatherForecast")]
public async Task<object> Get()
{
    var roleList = await _baseService.Query();
    return roleList;
}

二、使用Autofac实现对控制层的属性自动依赖注入

1.导入autofac包10.0.0版本

<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="8.0.0" />

2.配置控制器类的公共属性注入依赖项的文件

public class AutofacPropertityModuleReg : Module
{
  /// <summary>
  /// 意味着 Autofac 会自动为控制器类的公共属性注入依赖项,而不需要通过构造函数注入
  /// 依赖属性的形式: public IBaseService<Role, RoleVo> _roleServiceObj { get; set; }
  /// </summary>
  /// <param name="builder"></param>
  protected override void Load(ContainerBuilder builder)
  {
      var controllerBaseType = typeof(ControllerBase);
      builder.RegisterAssemblyTypes(typeof(Program).Assembly)
          .Where(t => controllerBaseType.IsAssignableFrom(t) && t != controllerBaseType)
          .PropertiesAutowired();
  }
}

3.在webpai的program.cs文件中通过实现接口来创建控制器实例并解析其依赖项的类

// 通过实现接口来创建控制器实例并解析其依赖项的类,(依赖注入控制器属性的前提条件)
builder.Services.Replace(ServiceDescriptor.Transient<IControllerActivator, ServiceBasedControllerActivator>());

须在"builder.Services.AddControllers();"前设置

4.在webpai的program.cs文件中注册AutofacPropertityModuleReg
image

// 使用Autofac实现程序集依赖注入
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureContainer<ContainerBuilder>(builder =>
{
    builder.RegisterModule<AutofacModuleRegister>();
    builder.RegisterModule<AutofacPropertityModuleReg>();
});

5.在control层中使用方式
image
注入的属性一定要使用prop格式

private readonly ILogger<WeatherForecastController> _logger;
private readonly IMapper _mapper;
public IBaseService<Role, RoleVo> _baseService { get; set; }

[HttpGet(Name = "GetWeatherForecast")]
public async Task<object> Get()
{
    var roleList = await _baseService.Query();
    return roleList;
}
posted @ 2025-08-12 21:32  一切为了尚媛小姐  阅读(31)  评论(0)    收藏  举报