Autofac 官方地址:https://autofaccn.readthedocs.io/en/latest/advanced/interceptors.html

(1)引用 nuget :Autofac.Extensions.DependencyInjection  Autofac.Extras.DynamicProxy

(2)修改入口文件

public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                //改用Autofac来实现依赖注入
                .UseServiceProviderFactory(new AutofacServiceProviderFactory())
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                    
                });

(3)修改startup 文件

     //autofac 新增
        public ILifetimeScope AutofacContainer { get; private set; }
  public void ConfigureContainer(ContainerBuilder builder)
        {
}

(4)创建AOP拦截文件

using Castle.DynamicProxy;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;

namespace WebApplication1.Aufac
{
    public class CacheIntercept : IInterceptor
    {
        public CacheIntercept()
        { }
        public void Intercept(IInvocation invocation)
        {
            var method = invocation.MethodInvocationTarget ?? invocation.Method;
            Debug.WriteLine("before");
            invocation.Proceed();
            Debug.WriteLine("end");
        }
    }
}

(4)应用拦截效果

      4-1 使用接口进行AOP拦截

       4.1.1 创建接口文件,并实现接口

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;

namespace WebApplication1.Aufac
{
    public interface IAufacInterFace3
    {
        string GetName();

    }
    public class AufacInterFace3: IAufacInterFace3
    {
        /// <summary>
        /// 基于接口的AOP
        /// </summary>
        /// <returns></returns>
        public   string GetName()
        {
            Debug.WriteLine("this is getname");
            return "this is getname";
        }
    }
}

4.1.2配置startup 注入到服务

       public void ConfigureContainer(ContainerBuilder builder)
        {

            //基于接口的AOP
            builder.RegisterType<WebApplication1.Aufac.CacheIntercept>();
            builder.RegisterType<WebApplication1.Aufac.AufacInterFace3>().As<WebApplication1.Aufac.IAufacInterFace3>()
              .AsImplementedInterfaces()
             .InterceptedBy(typeof(WebApplication1.Aufac.CacheIntercept))
             .EnableInterfaceInterceptors();
}

4.1.3在代码里调用

AufacInterFace3 发现已经进行了拦截处理
调用代码如下
  WebApplication1.Aufac.IAufacInterFace3 face3;

        public WeatherForecastController(WebApplication1.Aufac.IAufacInterFace3 interFace3
            )
        {
            face3 = interFace3;
        }
        [HttpGet]
        //[Caching(AbsoluteExpiration =2,keyname ="id",keyvaluename ="id")]
        public virtual string Get()
        {
            face2.GetName();
            return DateTime.Now.ToString();
        }