实现服务注入和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);
}
具体的其他相关类请移到类库中去查找本人博客都有