首页 > 其他分享 >Net7配置Autofac下IOC中的AOP,以及Autofac的三种生命周期写法

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

时间:2023-08-15 14:57:03浏览次数:54  
标签:Autofac invocation LogInformation AOP Net7 Logger public

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

标签:Autofac,invocation,LogInformation,AOP,Net7,Logger,public
From: https://www.cnblogs.com/SevenWang/p/17631264.html

相关文章

  • 深入解析Spring的IOC与AOP及其在项目中的应用
    推荐阅读「java、python面试题」来自UC网盘app分享,打开手机app,额外获得1T空间https://drive.uc.cn/s/2aeb6c2dcedd4AIGC资料包https://drive.uc.cn/s/6077fc42116d4https://pan.xunlei.com/s/VN_qC7kwpKFgKLto4KgP4Do_A1?pwd=7kbv#https://yv4kfv1n3j.feishu.cn/docx/MRyxdaq......
  • Net7配置跨域和部分跨域支持
    跨域策略应该不算陌生,是浏览器的同源策略做的限制,下面基于后端开发来完成跨域的配置和策略一:全局跨域支持///<summary>///跨域///</summary>publicstaticclassCorsExtension{///<summary>///配置跨域策略///</summary>///<paramna......
  • Net7中Swagger增加注释
    Swagger增加注释其实很简单右键项目,属性勾选文档文件即可 然后代码配置路径:ApiVersions是版本,可以忽略并写死services.AddSwaggerGen(option=>{foreach(varversionintypeof(ApiVersions).GetEnumNames()){option.SwaggerDoc(version,newOpenApi......
  • 认识Spring AOP 面向切面编程
    一.什么是SpringAOP关于什么是SpringAOP.当我翻到官方文档的时候也是一惊LetusbeginbydefiningsomecentralAOPconceptsandterminology.ThesetermsarenotSpring-specific…unfortunately,AOPterminologyisnotparticularlyintuitive;however,itwoul......
  • 在 Spring Framework 中实现自定义 AOP 切面
    在SpringFramework中,面向切面编程(AOP)是一种重要的编程范式,它允许我们在应用程序中以模块化的方式处理横切关注点(如日志记录、事务管理等)。本文将深入探讨如何使用SpringFramework实现自定义AOP切面,通过代码示例演示其实际应用。1.概述AOP的核心思想是将横切关注点与主要......
  • Spring AOP详解
    1. AOP编程介绍OOP:面向对象编程,以对象为中心,进行程序的设计和开发。AOP:面向切面编程,以程序中的切面为中心,进行程序的设计和开发。可以把业务功能和非业务功能进行分离。实现AOP编程的方式:1)动态代理模式2)使用Spring的AOP模块3)AspectJ:专业的切面框架切面:程序中,一些通用的功能和方法......
  • Autofac
    AutoFac(1)使用NuGet引入包Autofac.Extention.net6program.cs中替換原生IOC容器,此时原生的IOC容器中的东西被转移到Autofac里,在ConfigureContainer中不注册也行,不是并行状态//替换原生IOC容器=>autofac容器builder.Host.UseServiceProviderFactory(newAutof......
  • java面向切面编程---AOP之环绕通知
    packagecom.xlkh.bigscreen.common.aspect;importcom.alibaba.fastjson.JSON;importcom.fasterxml.jackson.databind.ObjectMapper;importcom.xlkh.bigscreen.common.utils.RedisDeviceUtil;importcom.xlkh.bigscreen.service.bigscreen.BigscreenRedisService;imp......
  • 10、Spring之AOP概述
    10.1、概念AOP(AspectOrientedProgramming)是一种设计思想,是软件设计领域中的面向切面编程AOP是面向对象编程(OOP)的一种补充和完善,OOP是纵向继承机制,AOP是横向抽取机制AOP能通过预编译方式和运行期动态代理方式,实现在不修改源代码的情况下动态地为程序添加统一的附加功能......
  • uniapp中微信小程序取手机号(后端net7+盛派SDK)
    uniapp中微信小程序取手机号(后端net7+盛派SDK)2023年08月09日测试成功,不过看微信的小程序文档8月26日起微信小程序取手机号就要收费了,取一次3分钱。原理:前端取到code后传到后端,后端再把code传给微信的某一接口取手机号前端uniapp中的vue代码:<template><view><......