使用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

// 使用Autofac实现程序集依赖注入
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureContainer<ContainerBuilder>(builder =>
{
builder.RegisterModule<AutofacModuleRegister>();
builder.RegisterModule<AutofacPropertityModuleReg>();
});
4.使用通过autofac对程序集中的类进行依赖注入

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

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

注入的属性一定要使用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;
}

浙公网安备 33010602011771号