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();