实现服务注入和AOP需要安装如下包
Castle.Core.AsyncInterceptor public void ConfigureServices(IServiceCollection services) { #region 自动注入拥有ITransientDependency,IScopeDependency或ISingletonDependency的类 services.AddFxServices(); #endregion } private static readonly ProxyGenerator _generator = new ProxyGenerator(); /// <summary> /// 自动注入拥有ITransientDependency,IScopeDependency或ISingletonDependency的类 /// </summary> /// <param name="services">服务集合</param> /// <returns></returns> public static IServiceCollection AddFxServices(this IServiceCollection services) { Dictionary<Type, ServiceLifetime> lifeTimeMap = new Dictionary<Type, ServiceLifetime> { { typeof(ITransientDependency), ServiceLifetime.Transient}, { typeof(IScopedDependency),ServiceLifetime.Scoped}, { typeof(ISingletonDependency),ServiceLifetime.Singleton} }; //获取所有解决方案自定义类,aType为程序集所有类 GlobalData.AllFxTypes.ForEach(aType => { //aMap为生命周期接口 lifeTimeMap.ToList().ForEach(aMap => { //ITransientDependency,IScopeDependency或ISingletonDependency var theDependency = aMap.Key; //IsAssignableFrom判断是否相同或是另一个类的超类或接口,不等于aType类,aType不是抽象类,aType是类 if (theDependency.IsAssignableFrom(aType) && theDependency != aType && !aType.IsAbstract && aType.IsClass) { //注入实现ServiceDescriptor(服务的类型,用于创建服务实现的新实例的工厂/实现的类型,服务的生存期)的类 services.Add(new ServiceDescriptor(aType, aType, aMap.Value)); //获取所有解决方案自定义类,aType为程序集所有接口,接口不等于生命周期接口 var interfaces = GlobalData.AllFxTypes.Where(x => x.IsAssignableFrom(aType) && x.IsInterface && x != theDependency).ToList(); //有接口则注入接口 if (interfaces.Count > 0) { interfaces.ForEach(aInterface => { //注入AOP services.Add(new ServiceDescriptor(aInterface, serviceProvider => { CastleInterceptor castleInterceptor = new CastleInterceptor(serviceProvider); //Castle的动态代理实现服务注入和AOP return _generator.CreateInterfaceProxyWithTarget(aInterface, serviceProvider.GetService(aType), castleInterceptor); }, aMap.Value)); }); } //无接口则注入自己 else { services.Add(new ServiceDescriptor(aType, aType, aMap.Value)); } } }); }); return services; }在服务层中的使用如下:特性必须是继承BaseAOPAttribute
[DataAddLog(UserLogType.系统用户管理, "RealName", "用户")]//操作日志 [DataRepeatValidate( new string[] { "UserName" }, new string[] { "用户名" })]//校验用户 [Transactional]//多操作提供的事务特性 public async Task AddDataAsync(UserEditInputDTO input) { await InsertAsync(_mapper.Map<Base_User>(input)); await SetUserRoleAsync(input.Id, input.RoleIdList); }具体的其他相关类请移到类库中去查找本人博客都有