首先搞三个特性类
/// <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 RollerWork