.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);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?