.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);
    }
}

image

posted @   柴油飞机  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示