.net6 WebApi 使用特性实现自动依赖注入
首先搞三个特性类
/// <summary>
/// 作用域
/// </summary>
[AttributeUsage(AttributeTargets.Class)]
public class DiScopedAttribute : Attribute
{
}
/// <summary>
/// 单例
/// </summary>
[AttributeUsage(AttributeTargets.Class)]
public class DiSingletonAttribute : Attribute
{
}
/// <summary>
/// 瞬时
/// </summary>
[AttributeUsage(AttributeTargets.Class)]
public class DiTransientAttribute : Attribute
{
}
给IServiceCollection写扩展方法
/// <summary>
/// 扫码特性来实现自动依赖注入
/// </summary>
/// <param name="services"></param>
/// <returns></returns>
public static IServiceCollection RegisterServicesByAttributes(this IServiceCollection services)
{
// 获取整个解决方法的所有程序集
var allAssemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (var assembly in allAssemblies)
{
// 注册作用域服务
var scopedTypes = assembly.GetTypes().Where(t => t.IsDefined(typeof(DiScopedAttribute), true));
foreach (var type in scopedTypes)
{
services.AddScoped(type.GetInterfaces().FirstOrDefault() ?? type, type);
}
// 注册瞬态服务
var transientTypes = assembly.GetTypes().Where(t => t.IsDefined(typeof(DiTransientAttribute), true));
foreach (var type in transientTypes)
{
services.AddTransient(type.GetInterfaces().FirstOrDefault() ?? type, type);
}
// 注册单例服务
var singletonTypes = assembly.GetTypes().Where(t => t.IsDefined(typeof(DiSingletonAttribute), true));
foreach (var type in singletonTypes)
{
services.AddSingleton(type.GetInterfaces().FirstOrDefault() ?? type, type);
}
}
return services;
}
在Program调用
builder.Services.RegisterServicesByAttributes();
在需要注入的类头上打上特性就可以实现依赖注入了 不需要使用AutoFac
[DiScoped]
public class Student
{
public int Age { get; set; } = 18;
}
测试 可以正常使用并获取到了Age的值
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
private readonly Student student;
public ValuesController(Student student)
{
this.student = student;
}
[HttpGet]
public IActionResult GetAge()
{
return Ok(student.Age);
}
}


浙公网安备 33010602011771号