Net7配置Autofac下IOC中的AOP,以及Autofac的三种生命周期写法
Net7配置Autofac下IOC中的AOP是分两种,一种是基于接口的,一种是基于实现类的
基于接口的好处是简单,但不能有效的控制具体到某个方法。也就是说,只能基于类来做操作,一个类下所有的方法都要接受注册
基于实现类的是稍微麻烦一点,生效方法必须改为 virtual ,但可以实现到具体某个方法的效果。
==================================================
顺路补一下Autofac中的三种注册,瞬时,作用域,单例的写法
值得一提,Autofac和默认IOC容器不是替换关系,在默认IOC容器里面注入的,也可以在这里收到和启用。
containerBuilder.RegisterType<UserService>().As<IUserService>()
.InstancePerLifetimeScope()//作用域 类同 Scope
.SingleInstance() // 单例
.InstancePerDependency(); // 瞬时 类同 AddTransient
==================================================
直接上代码
基于接口的
public static void AutofacRegister(this ConfigureHostBuilder host) { host.UseServiceProviderFactory(new AutofacServiceProviderFactory());//通过工厂替换,把Autofac整合进来 host.ConfigureContainer<ContainerBuilder>(containerBuilder => { containerBuilder.RegisterType<UserService>().As<IUserService>() .EnableInterfaceInterceptors(); //通过接口支持AOP扩展 //.EnableClassInterceptors(); //通过类支持AOP扩展 //注册AOP扩展 注意这里一定要注册 containerBuilder.RegisterType<CustomLogInterceptor>(); }); }
AOP的类是什么样子呢?AOP类通用两种实现,需要注意的是,这个类也必须注册 IOC
//核心就是这里,继承于 IInterceptor
public class CustomLogInterceptor : IInterceptor { private readonly ILogger<CustomLogInterceptor> _Logger; public CustomLogInterceptor(ILogger<CustomLogInterceptor> logger) { _Logger = logger; } public void Intercept(IInvocation invocation) { _Logger.LogInformation($"=================={invocation.Method.Name} 执行前~~========================="); _Logger.LogInformation($"目标方法开始执行:{invocation.Method.Name}"); _Logger.LogInformation($"参数数据:{Newtonsoft.Json.JsonConvert.SerializeObject(invocation.Arguments)}"); _Logger.LogInformation($"=================={invocation.Method.Name} 执行前~~========================="); invocation.Proceed();// 开始去执行目标方法 _Logger.LogInformation($"=================={{{invocation.Method.Name} 执行后~~========================="); _Logger.LogInformation($"目标方法执行完毕:{invocation.Method.Name}"); _Logger.LogInformation($"参数数据:{Newtonsoft.Json.JsonConvert.SerializeObject(invocation.ReturnValue)}"); _Logger.LogInformation($"=================={{{invocation.Method.Name} 执行后~~========================="); } }
第三步,接口上贴特性,完成调用。
[Intercept(typeof(CustomLogInterceptor))] public interface IUserService:IBaseService { public void ShowSomething(); }
====================================分割线=====================================================
说第二种基于类的,.EnableClassInterceptors();改这里就可以了
public static void AutofacRegister(this ConfigureHostBuilder host) { host.UseServiceProviderFactory(new AutofacServiceProviderFactory());//通过工厂替换,把Autofac整合进来 host.ConfigureContainer<ContainerBuilder>(containerBuilder => { containerBuilder.RegisterType<UserService>().As<IUserService>() //.EnableInterfaceInterceptors(); //通过接口支持AOP扩展 .EnableClassInterceptors(); //通过类支持AOP扩展 //注册AOP扩展 注意这里一定要注册 containerBuilder.RegisterType<CustomLogInterceptor>(); }); }
AOP的类和上面第一种一样,没有变化,
特性也没有变化,直接贴到实现类上即可
[Intercept(typeof(CustomLogInterceptor))] public class UserService : BaseService, IUserService { public UserService(DbContext context) : base(context) { } public virtual void ShowSomething() { Console.WriteLine("Ok,Nothing"); } public void OtherShowSomething() { Console.WriteLine("Ok,OtherShowSomething"); } }
那怎么控制实现与否呢?
其实很简单,在需要实现的方法上增加Virtual即可,它覆写做操作即可。