Net7配置Autofac下IOC中的AOP,以及Autofac的三种生命周期写法

发布时间 2023-08-15 14:46:55作者: 王月半子

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即可,它覆写做操作即可。