AutoFac实现AOP扩展

1.nuget包

 

2.用autoFuc替代原来的IOC容器。

program类中修改代码

public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
            .UseServiceProviderFactory(new AutofacServiceProviderFactory())
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });

添加动态代理类

public class CustomAutofacCacheInterceptor : IInterceptor
    {
        private IDistributedCache _iDistributeCache;

        public CustomAutofacCacheInterceptor(IDistributedCache distributeCache) {
            this._iDistributeCache = distributeCache;
        }

        public void Intercept(IInvocation invocation)
        {
            string key = $"{invocation.Method}_{string.Join(",", invocation.Arguments)}";
            string result = this._iDistributeCache.GetString(key);
            if (string.IsNullOrEmpty(result)) {
                invocation.Proceed();  //实际执行的方法
                this._iDistributeCache.SetString(key,Convert.ToString(invocation.ReturnValue)  //设置缓存,
                    , new DistributedCacheEntryOptions()
                    {
                        AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(20)
                    });
            }
            else {
                invocation.ReturnValue = Convert.ChangeType(result, invocation.Method.ReturnType); //取缓存
            }
        }
    }

startup类中修改代码

public void ConfigureContainer(ContainerBuilder containerBuilder) 
        {
            containerBuilder.RegisterType<UserService>().As<IUserService>().EnableInterfaceInterceptors()
                .InterceptedBy(typeof(CustomAutofacCacheInterceptor));

            containerBuilder.RegisterType<CustomAutofacCacheInterceptor>();
        }

当执行UserService类中的方法时,会走代理类。实际执行的方法为invocation.Proceed();

 

posted @ 2022-04-10 18:00  留下成长的足迹  阅读(183)  评论(0编辑  收藏  举报