ASP.NET Core MVC 项目 Autofac 支持 AOP
创始人
2025-06-01 00:06:19
0

目录

一:Autofac支持AOP

二:Autofac支持AOP的多种方式

一:类扩展

二:接口扩展

三:类扩展和接口扩展的区别

三:Autofac支持AOP扩展日志记录功能

四:Autofac支持AOP扩展缓存功能

五:Autofac支持AOP扩展IInterceptorSelector


一:Autofac支持AOP

当前项目右键管理Nuget包引入:Castle.core

扩展CusotmInterceptor类

using Castle.DynamicProxy;namespace Study_ASP.Net_Core_MVC.Services
{public class CusotmInterceptor : IInterceptor{/// /// 切入者逻辑/// /// public void Intercept(IInvocation invocation){//方法之前的逻辑Console.WriteLine("Begore");//执行真实的方法invocation.Proceed();//方法之后的逻辑Console.WriteLine("After");}}
}

修改关键类ApplePhone

using Autofac.Extras.DynamicProxy;
using Study_ASP.NET_Core_MVC.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Study_ASP.Net_Core_MVC.Services
{/// /// 标识特性支持AOP/// [Intercept(typeof(CusotmInterceptor))]public class ApplePhone : IPhone{public IMicroPhone MicroPhone { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }public IHeadPhone HeadPhone { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }public ApplePhone(){Console.WriteLine("{0}无参构造函数", this.GetType().Name);}public ApplePhone(IHeadPhone headPhone){Console.WriteLine("{0}有参构造函数:{1}", this.GetType().Name,headPhone);}/// /// 虚方法/// 打电话方法/// public virtual void Call(){Console.WriteLine("{0}打电话", this.GetType().Name);}/// /// 发短信方法/// public void Text(){Console.WriteLine("{0}发短信", this.GetType().Name);}/// /// 显示当前时间信息/// /// 时间信息/// public string ShowTime(string timeInfo){Console.WriteLine("显示时间:{0}", timeInfo);return $"当前时间:{timeInfo}";}}
}

修改Program.cs文件

using Autofac;
using Autofac.Extensions.DependencyInjection;
using Autofac.Extras.DynamicProxy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Study_ASP.Net_Core_MVC.Services;
using Study_ASP.NET_Core_MVC.Interfaces;
using Study_ASP.NET_Core_MVC.Models;//表示整个应用程序,调用CreateBuilder方法创建一个WebApplicationBuilder对象。
var builder = WebApplication.CreateBuilder(args);
//向管道容器添加注册中间件
//添加注册控制器视图中间件
builder.Services.AddControllersWithViews();
//添加注册Session中间件
builder.Services.AddSession();//添加注册Autofac中间件
//通过工厂替换整合Autofac
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
builder.Host.ConfigureContainer(containerBuilder =>
{//注册服务containerBuilder.RegisterType().As();containerBuilder.RegisterType().As();//支持AAOP扩展containerBuilder.RegisterType().As().EnableClassInterceptors();//注册切入逻辑containerBuilder.RegisterType();//注册控制器和抽象关系var controllerBaseType = typeof(ControllerBase);//支持属性注入到ControllerBase中containerBuilder.RegisterAssemblyTypes(typeof(Program).Assembly).Where(t => controllerBaseType.IsAssignableFrom(t) && t != controllerBaseType).PropertiesAutowired(new CusotmPropertySelector());
});
//添加注册控制器属性注入
builder.Services.Replace(ServiceDescriptor.Transient());//配置管道容器中间件,构造WebApplication实例
var app = builder.Build();
//判断是否是开发模式
if (!app.Environment.IsDevelopment())
{//向管道中添加中间件,该中间件将捕获异常、记录异常、重置请求路径并重新执行请求。app.UseExceptionHandler("/Shared/Error");//向管道中添加用于使用HSTS的中间件,该中间件添加了Strict Transport Security标头。默认值为30天app.UseHsts();
}
//向管道添加Session中间件
app.UseSession();
//向管道添加用于将HTTP请求重定向到HTTPS的中间件。
app.UseHttpsRedirection();
//向管道添加为当前请求路径启用静态文件服务
app.UseStaticFiles();
//向管道添加路由配置中间件
app.UseRouting();
//向管道添加鉴权中间件
app.UseAuthentication();
//向管道添加授权中间件
app.UseAuthorization();
//向管道添加默认路由中间件
app.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");
//向管道添加启动应用程序中间件
app.Run();

修改控制器文件

using Autofac;
using Microsoft.AspNetCore.Mvc;
using Study_ASP.Net_Core_MVC.Services;
using Study_ASP.NET_Core_MVC.Interfaces;
using Study_ASP.NET_Core_MVC.Models;
using System.Diagnostics;namespace Study_ASP.NET_Core_MVC.Controllers
{public class HomeController : Controller{/// /// 定义构造函数/// private readonly ILogger _logger;private IPhone iPhone;/// /// 初始化构造函数/// /// 控制器构造函数/// 服务构造函数/// 上下文构造函数/// 自定义构造函数public HomeController(ILogger logger, IServiceProvider serviceProvider, IComponentContext componentContext, IPhone iPhone){//通过调试查看获取的数据_logger = logger;this.iPhone = iPhone;}/// /// Get请求/// Home控制器/// Index方法/// /// [HttpGet]public IActionResult Index(){//调用发短信方法iPhone.Text();//调用打电话方法iPhone.Call();//电泳显示实践方法ViewBag.ShowTime = iPhone.ShowTime(DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss"));return View();}}
}

二:Autofac支持AOP的多种方式

一:类扩展

扩展CusotmInterceptor类

using Castle.DynamicProxy;namespace Study_ASP.Net_Core_MVC.Services
{public class CusotmInterceptor : IInterceptor{/// /// 切入者逻辑/// /// public void Intercept(IInvocation invocation){//方法之前的逻辑Console.WriteLine("Begore");//执行真实的方法invocation.Proceed();//方法之后的逻辑Console.WriteLine("After");}}
}

修改关键类ApplePhone

using Autofac.Extras.DynamicProxy;
using Study_ASP.NET_Core_MVC.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Study_ASP.Net_Core_MVC.Services
{/// /// 标识特性支持AOP/// [Intercept(typeof(CusotmInterceptor))]public class ApplePhone : IPhone{public IMicroPhone MicroPhone { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }public IHeadPhone HeadPhone { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }public ApplePhone(){Console.WriteLine("{0}无参构造函数", this.GetType().Name);}public ApplePhone(IHeadPhone headPhone){Console.WriteLine("{0}有参构造函数:{1}", this.GetType().Name,headPhone);}/// /// 虚方法/// 打电话方法/// public virtual void Call(){Console.WriteLine("{0}打电话", this.GetType().Name);}/// /// 发短信方法/// public void Text(){Console.WriteLine("{0}发短信", this.GetType().Name);}/// /// 显示当前时间信息/// /// 时间信息/// public string ShowTime(string timeInfo){Console.WriteLine("显示时间:{0}", timeInfo);return $"当前时间:{timeInfo}";}}
}

修改Program.cs文件

using Autofac;
using Autofac.Extensions.DependencyInjection;
using Autofac.Extras.DynamicProxy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Study_ASP.Net_Core_MVC.Services;
using Study_ASP.NET_Core_MVC.Interfaces;
using Study_ASP.NET_Core_MVC.Models;//表示整个应用程序,调用CreateBuilder方法创建一个WebApplicationBuilder对象。
var builder = WebApplication.CreateBuilder(args);
//向管道容器添加注册中间件
//添加注册控制器视图中间件
builder.Services.AddControllersWithViews();
//添加注册Session中间件
builder.Services.AddSession();//添加注册Autofac中间件
//通过工厂替换整合Autofac
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
builder.Host.ConfigureContainer(containerBuilder =>
{//注册服务containerBuilder.RegisterType().As();containerBuilder.RegisterType().As();//支持AAOP扩展--类扩展containerBuilder.RegisterType().As().EnableClassInterceptors();//注册切入逻辑containerBuilder.RegisterType();//注册控制器和抽象关系var controllerBaseType = typeof(ControllerBase);//支持属性注入到ControllerBase中containerBuilder.RegisterAssemblyTypes(typeof(Program).Assembly).Where(t => controllerBaseType.IsAssignableFrom(t) && t != controllerBaseType).PropertiesAutowired(new CusotmPropertySelector());
});
//添加注册控制器属性注入
builder.Services.Replace(ServiceDescriptor.Transient());//配置管道容器中间件,构造WebApplication实例
var app = builder.Build();
//判断是否是开发模式
if (!app.Environment.IsDevelopment())
{//向管道中添加中间件,该中间件将捕获异常、记录异常、重置请求路径并重新执行请求。app.UseExceptionHandler("/Shared/Error");//向管道中添加用于使用HSTS的中间件,该中间件添加了Strict Transport Security标头。默认值为30天app.UseHsts();
}
//向管道添加Session中间件
app.UseSession();
//向管道添加用于将HTTP请求重定向到HTTPS的中间件。
app.UseHttpsRedirection();
//向管道添加为当前请求路径启用静态文件服务
app.UseStaticFiles();
//向管道添加路由配置中间件
app.UseRouting();
//向管道添加鉴权中间件
app.UseAuthentication();
//向管道添加授权中间件
app.UseAuthorization();
//向管道添加默认路由中间件
app.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");
//向管道添加启动应用程序中间件
app.Run();

修改控制器文件

using Autofac;
using Microsoft.AspNetCore.Mvc;
using Study_ASP.Net_Core_MVC.Services;
using Study_ASP.NET_Core_MVC.Interfaces;
using Study_ASP.NET_Core_MVC.Models;
using System.Diagnostics;namespace Study_ASP.NET_Core_MVC.Controllers
{public class HomeController : Controller{/// /// 定义构造函数/// private readonly ILogger _logger;private IPhone iPhone;/// /// 初始化构造函数/// /// 控制器构造函数/// 服务构造函数/// 上下文构造函数/// 自定义构造函数public HomeController(ILogger logger, IServiceProvider serviceProvider, IComponentContext componentContext, IPhone iPhone){//通过调试查看获取的数据_logger = logger;this.iPhone = iPhone;}/// /// Get请求/// Home控制器/// Index方法/// /// [HttpGet]public IActionResult Index(){//调用发短信方法iPhone.Text();//调用打电话方法iPhone.Call();//显示时间方法ViewBag.ShowTime = iPhone.ShowTime(DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss"));return View();}}
}

二:接口扩展

扩展CusotmInterceptor类

using Castle.DynamicProxy;namespace Study_ASP.Net_Core_MVC.Services
{public class CusotmInterceptor : IInterceptor{/// /// 切入者逻辑/// /// public void Intercept(IInvocation invocation){//方法之前的逻辑Console.WriteLine("Begore");//执行真实的方法invocation.Proceed();//方法之后的逻辑Console.WriteLine("After");}}
}

修改关键类IPhone

using Autofac.Extras.DynamicProxy;
using DocumentFormat.OpenXml.Drawing.Charts;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Study_ASP.NET_Core_MVC.Interfaces
{/// /// 标识特性支持AOP/// [Intercept(typeof(CusotmInterceptor))]public interface IPhone{IMicroPhone MicroPhone { get; set; }IHeadPhone HeadPhone { get; set; }/// /// 打电话方法/// void Call();/// /// 发短信方法/// void Text();/// /// 显示当前时间信息/// /// 时间信息/// string ShowTime(string timeInfo);}public interface IMicroPhone { }public interface IHeadPhone { }
}

修改Program.cs文件

using Autofac;
using Autofac.Extensions.DependencyInjection;
using Autofac.Extras.DynamicProxy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Study_ASP.Net_Core_MVC.Services;
using Study_ASP.NET_Core_MVC.Interfaces;
using Study_ASP.NET_Core_MVC.Models;//表示整个应用程序,调用CreateBuilder方法创建一个WebApplicationBuilder对象。
var builder = WebApplication.CreateBuilder(args);
//向管道容器添加注册中间件
//添加注册控制器视图中间件
builder.Services.AddControllersWithViews();
//添加注册Session中间件
builder.Services.AddSession();//添加注册Autofac中间件
//通过工厂替换整合Autofac
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
builder.Host.ConfigureContainer(containerBuilder =>
{//注册服务containerBuilder.RegisterType().As();containerBuilder.RegisterType().As();//支持AAOP扩展--接口扩展containerBuilder.RegisterType().As().EnableInterfaceInterceptors();//注册切入逻辑containerBuilder.RegisterType();//注册控制器和抽象关系var controllerBaseType = typeof(ControllerBase);//支持属性注入到ControllerBase中containerBuilder.RegisterAssemblyTypes(typeof(Program).Assembly).Where(t => controllerBaseType.IsAssignableFrom(t) && t != controllerBaseType).PropertiesAutowired(new CusotmPropertySelector());
});
//添加注册控制器属性注入
builder.Services.Replace(ServiceDescriptor.Transient());//配置管道容器中间件,构造WebApplication实例
var app = builder.Build();
//判断是否是开发模式
if (!app.Environment.IsDevelopment())
{//向管道中添加中间件,该中间件将捕获异常、记录异常、重置请求路径并重新执行请求。app.UseExceptionHandler("/Shared/Error");//向管道中添加用于使用HSTS的中间件,该中间件添加了Strict Transport Security标头。默认值为30天app.UseHsts();
}
//向管道添加Session中间件
app.UseSession();
//向管道添加用于将HTTP请求重定向到HTTPS的中间件。
app.UseHttpsRedirection();
//向管道添加为当前请求路径启用静态文件服务
app.UseStaticFiles();
//向管道添加路由配置中间件
app.UseRouting();
//向管道添加鉴权中间件
app.UseAuthentication();
//向管道添加授权中间件
app.UseAuthorization();
//向管道添加默认路由中间件
app.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");
//向管道添加启动应用程序中间件
app.Run();

修改控制器文件

using Autofac;
using Microsoft.AspNetCore.Mvc;
using Study_ASP.Net_Core_MVC.Services;
using Study_ASP.NET_Core_MVC.Interfaces;
using Study_ASP.NET_Core_MVC.Models;
using System.Diagnostics;namespace Study_ASP.NET_Core_MVC.Controllers
{public class HomeController : Controller{/// /// 定义构造函数/// private readonly ILogger _logger;private IPhone iPhone;/// /// 初始化构造函数/// /// 控制器构造函数/// 服务构造函数/// 上下文构造函数/// 自定义构造函数public HomeController(ILogger logger, IServiceProvider serviceProvider, IComponentContext componentContext, IPhone iPhone){//通过调试查看获取的数据_logger = logger;this.iPhone = iPhone;}/// /// Get请求/// Home控制器/// Index方法/// /// [HttpGet]public IActionResult Index(){//调用发短信方法iPhone.Text();//调用打电话方法iPhone.Call();//电泳显示实践方法ViewBag.ShowTime = iPhone.ShowTime(DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss"));return View();}}
}

三:类扩展和接口扩展的区别

通过EnableClassInterceptors类扩展时:

  1. 需要将Intercept标记到具体类上
  2. 只有在这个具体类上,标记了虚方法,虚方法才可以进入到IInterceptor中,来支持AOP扩展。

通过EnableInterfaceInterceptors接口扩展时:

  1. 需要将Intercept标记到抽象类上
  2. 只要是实现了这个接口,无论是否是虚方法,都可以进入到IInterceptor中,来支持AOP扩展。

三:Autofac支持AOP扩展日志记录功能

当前项目右键管理Nuget包引入:Microsoft.Extensions.Logging.Abstractions、Newtonsoft.Json

扩展CusotmLogInterceptor类

using Castle.Core.Logging;
using Castle.DynamicProxy;
using System;
using Microsoft.Extensions.Logging;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Study_ASP.NET_Core_MVC.Interfaces
{public class CusotmLogInterceptor : IInterceptor{/// /// 定义构造函数/// private readonly ILogger _ILogger;/// /// 初始化构造函数/// /// public CusotmLogInterceptor(ILogger logger){this._ILogger = logger;}/// /// 切入者逻辑/// /// public void Intercept(IInvocation invocation){//方法之前的逻辑Console.WriteLine("Begore");_ILogger.LogInformation($"参数:{Newtonsoft.Json.JsonConvert.SerializeObject(invocation.Arguments)}");_ILogger.LogInformation($"方法{invocation.Method.Name} 开始执行");//执行真实的方法invocation.Proceed();_ILogger.LogInformation($"方法{invocation.Method.Name} 执行完毕");//方法之后的逻辑Console.WriteLine("After");_ILogger.LogInformation($"结果:{Newtonsoft.Json.JsonConvert.SerializeObject(invocation.ReturnValue)}");}}
}

修改关键类IPhone

using Autofac.Extras.DynamicProxy;
using DocumentFormat.OpenXml.Drawing.Charts;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Study_ASP.NET_Core_MVC.Interfaces
{/// /// 标识特性支持AOP/// [Intercept(typeof(CusotmInterceptor))][Intercept(typeof(CusotmLogInterceptor))]public interface IPhone{IMicroPhone MicroPhone { get; set; }IHeadPhone HeadPhone { get; set; }/// /// 打电话方法/// void Call();/// /// 发短信方法/// void Text();/// /// 玩游戏方法/// /// /// object PlayGame(object play);/// /// 显示当前时间信息/// /// 时间信息/// string ShowTime(string timeInfo);}public interface IMicroPhone { }public interface IHeadPhone { }
}

修改关键类ApplePhone

using Autofac.Extras.DynamicProxy;
using Study_ASP.NET_Core_MVC.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Study_ASP.Net_Core_MVC.Services
{public class ApplePhone : IPhone{public IMicroPhone MicroPhone { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }public IHeadPhone HeadPhone { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }public ApplePhone(){Console.WriteLine("{0}无参构造函数", this.GetType().Name);}public ApplePhone(IHeadPhone headPhone){Console.WriteLine("{0}有参构造函数:{1}", this.GetType().Name,headPhone);}/// /// 虚方法/// 打电话方法/// public virtual void Call(){Console.WriteLine("{0}打电话", this.GetType().Name);}/// /// 发短信方法/// public void Text(){Console.WriteLine("{0}发短信", this.GetType().Name);}/// /// 玩游戏方法/// /// /// public object PlayGame(object play){return new{Id = 123,Name = "VinCente"};}/// /// 显示当前时间信息/// /// 时间信息/// public string ShowTime(string timeInfo){Console.WriteLine("显示时间:{0}", timeInfo);return $"当前时间:{timeInfo}";}}
}

修改Program.cs文件

using Autofac;
using Autofac.Extensions.DependencyInjection;
using Autofac.Extras.DynamicProxy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Study_ASP.Net_Core_MVC.Services;
using Study_ASP.NET_Core_MVC.Interfaces;
using Study_ASP.NET_Core_MVC.Models;//表示整个应用程序,调用CreateBuilder方法创建一个WebApplicationBuilder对象。
var builder = WebApplication.CreateBuilder(args);
//向管道容器添加注册中间件
//添加注册控制器视图中间件
builder.Services.AddControllersWithViews();
//添加注册Session中间件
builder.Services.AddSession();//添加注册Autofac中间件
//通过工厂替换整合Autofac
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
builder.Host.ConfigureContainer(containerBuilder =>
{//注册服务containerBuilder.RegisterType().As();containerBuilder.RegisterType().As();//支持AAOP扩展--接口扩展containerBuilder.RegisterType().As().EnableInterfaceInterceptors();//注册切入逻辑containerBuilder.RegisterType();containerBuilder.RegisterType();//注册控制器和抽象关系var controllerBaseType = typeof(ControllerBase);//支持属性注入到ControllerBase中containerBuilder.RegisterAssemblyTypes(typeof(Program).Assembly).Where(t => controllerBaseType.IsAssignableFrom(t) && t != controllerBaseType).PropertiesAutowired(new CusotmPropertySelector());
});
//添加注册控制器属性注入
builder.Services.Replace(ServiceDescriptor.Transient());//配置管道容器中间件,构造WebApplication实例
var app = builder.Build();
//判断是否是开发模式
if (!app.Environment.IsDevelopment())
{//向管道中添加中间件,该中间件将捕获异常、记录异常、重置请求路径并重新执行请求。app.UseExceptionHandler("/Shared/Error");//向管道中添加用于使用HSTS的中间件,该中间件添加了Strict Transport Security标头。默认值为30天app.UseHsts();
}
//向管道添加Session中间件
app.UseSession();
//向管道添加用于将HTTP请求重定向到HTTPS的中间件。
app.UseHttpsRedirection();
//向管道添加为当前请求路径启用静态文件服务
app.UseStaticFiles();
//向管道添加路由配置中间件
app.UseRouting();
//向管道添加鉴权中间件
app.UseAuthentication();
//向管道添加授权中间件
app.UseAuthorization();
//向管道添加默认路由中间件
app.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");
//向管道添加启动应用程序中间件
app.Run();

修改控制器文件

using Autofac;
using Microsoft.AspNetCore.Mvc;
using Study_ASP.Net_Core_MVC.Services;
using Study_ASP.NET_Core_MVC.Interfaces;
using Study_ASP.NET_Core_MVC.Models;
using System.Diagnostics;namespace Study_ASP.NET_Core_MVC.Controllers
{public class HomeController : Controller{/// /// 定义构造函数/// private readonly ILogger _logger;private IPhone iPhone;/// /// 初始化构造函数/// /// 控制器构造函数/// 服务构造函数/// 上下文构造函数/// 自定义构造函数public HomeController(ILogger logger, IServiceProvider serviceProvider, IComponentContext componentContext, IPhone iPhone){//通过调试查看获取的数据_logger = logger;this.iPhone = iPhone;}/// /// Get请求/// Home控制器/// Index方法/// /// [HttpGet]public IActionResult Index(){//调用发短信方法iPhone.Text();//调用打电话方法iPhone.Call();//调用玩游戏方法object oInstance = iPhone.PlayGame(new { playId = 123, playName = "我要玩游戏" });//电泳显示实践方法ViewBag.ShowTime = iPhone.ShowTime(DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss"));return View();}}
}

结果截图

四:Autofac支持AOP扩展缓存功能

扩展CusotmCacheInterceptor类:

using Castle.DynamicProxy;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Study_ASP.NET_Core_MVC.Interfaces
{public class CusotmCacheInterceptor : IInterceptor{/// /// 定义构造函数/// private readonly ILogger _ILogger;/// /// 初始化构造函数/// /// public CusotmCacheInterceptor(ILogger logger){this._ILogger = logger;}//定义字典private static Dictionary _cacheDictionary = new Dictionary();/// /// 切入者逻辑/// /// public void Intercept(IInvocation invocation){//方法之前检查缓存的结果//定义Keystring cacheKey = invocation.Method.Name;//判断当前是否有缓存结果if (_cacheDictionary.ContainsKey(cacheKey)){invocation.ReturnValue = _cacheDictionary[cacheKey];}else{//执行真实的方法invocation.Proceed();//方法之后保存缓存的结果_cacheDictionary[cacheKey] = invocation.ReturnValue;}}}
}

修改关键类IPhone

using Autofac.Extras.DynamicProxy;
using DocumentFormat.OpenXml.Drawing.Charts;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Study_ASP.NET_Core_MVC.Interfaces
{/// /// 标识特性支持AOP/// [Intercept(typeof(CusotmCacheInterceptor))]public interface IPhone{IMicroPhone MicroPhone { get; set; }IHeadPhone HeadPhone { get; set; }/// /// 打电话方法/// void Call();/// /// 发短信方法/// void Text();/// /// 玩游戏方法/// /// /// object PlayGame(object play);/// /// 显示当前时间信息/// /// 时间信息/// string ShowTime(string timeInfo);}public interface IMicroPhone { }public interface IHeadPhone { }
}

修改关键类ApplePhone

using Autofac.Extras.DynamicProxy;
using Study_ASP.NET_Core_MVC.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Study_ASP.Net_Core_MVC.Services
{public class ApplePhone : IPhone{public IMicroPhone MicroPhone { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }public IHeadPhone HeadPhone { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }public ApplePhone(){Console.WriteLine("{0}无参构造函数", this.GetType().Name);}public ApplePhone(IHeadPhone headPhone){Console.WriteLine("{0}有参构造函数:{1}", this.GetType().Name,headPhone);}/// /// 虚方法/// 打电话方法/// public virtual void Call(){Console.WriteLine("{0}打电话", this.GetType().Name);}/// /// 发短信方法/// public void Text(){Console.WriteLine("{0}发短信", this.GetType().Name);}/// /// 玩游戏方法/// /// /// public object PlayGame(object play){return new{Id = 123,Name = "VinCente",DateTime = DateTime.Now};}/// /// 显示当前时间信息/// /// 时间信息/// public string ShowTime(string timeInfo){Console.WriteLine("显示时间:{0}", timeInfo);return $"当前时间:{timeInfo}";}}
}

修改Program.cs文件

using Autofac;
using Autofac.Extensions.DependencyInjection;
using Autofac.Extras.DynamicProxy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Study_ASP.Net_Core_MVC.Services;
using Study_ASP.NET_Core_MVC.Interfaces;
using Study_ASP.NET_Core_MVC.Models;//表示整个应用程序,调用CreateBuilder方法创建一个WebApplicationBuilder对象。
var builder = WebApplication.CreateBuilder(args);
//向管道容器添加注册中间件
//添加注册控制器视图中间件
builder.Services.AddControllersWithViews();
//添加注册Session中间件
builder.Services.AddSession();//添加注册Autofac中间件
//通过工厂替换整合Autofac
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
builder.Host.ConfigureContainer(containerBuilder =>
{//注册服务containerBuilder.RegisterType().As();containerBuilder.RegisterType().As();//支持AAOP扩展--接口扩展containerBuilder.RegisterType().As().EnableInterfaceInterceptors();//注册切入逻辑containerBuilder.RegisterType();containerBuilder.RegisterType();containerBuilder.RegisterType();//注册控制器和抽象关系var controllerBaseType = typeof(ControllerBase);//支持属性注入到ControllerBase中containerBuilder.RegisterAssemblyTypes(typeof(Program).Assembly).Where(t => controllerBaseType.IsAssignableFrom(t) && t != controllerBaseType).PropertiesAutowired(new CusotmPropertySelector());
});
//添加注册控制器属性注入
builder.Services.Replace(ServiceDescriptor.Transient());//配置管道容器中间件,构造WebApplication实例
var app = builder.Build();
//判断是否是开发模式
if (!app.Environment.IsDevelopment())
{//向管道中添加中间件,该中间件将捕获异常、记录异常、重置请求路径并重新执行请求。app.UseExceptionHandler("/Shared/Error");//向管道中添加用于使用HSTS的中间件,该中间件添加了Strict Transport Security标头。默认值为30天app.UseHsts();
}
//向管道添加Session中间件
app.UseSession();
//向管道添加用于将HTTP请求重定向到HTTPS的中间件。
app.UseHttpsRedirection();
//向管道添加为当前请求路径启用静态文件服务
app.UseStaticFiles();
//向管道添加路由配置中间件
app.UseRouting();
//向管道添加鉴权中间件
app.UseAuthentication();
//向管道添加授权中间件
app.UseAuthorization();
//向管道添加默认路由中间件
app.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");
//向管道添加启动应用程序中间件
app.Run();

修改控制器文件

using Autofac;
using Microsoft.AspNetCore.Mvc;
using Study_ASP.Net_Core_MVC.Services;
using Study_ASP.NET_Core_MVC.Interfaces;
using Study_ASP.NET_Core_MVC.Models;
using System.Diagnostics;namespace Study_ASP.NET_Core_MVC.Controllers
{public class HomeController : Controller{/// /// 定义构造函数/// private readonly ILogger _logger;private IPhone iPhone;/// /// 初始化构造函数/// /// 控制器构造函数/// 服务构造函数/// 上下文构造函数/// 自定义构造函数public HomeController(ILogger logger, IServiceProvider serviceProvider, IComponentContext componentContext, IPhone iPhone){//通过调试查看获取的数据_logger = logger;this.iPhone = iPhone;}/// /// Get请求/// Home控制器/// Index方法/// /// [HttpGet]public IActionResult Index(){//调用发短信方法iPhone.Text();//调用打电话方法iPhone.Call();//调用玩游戏方法object oInstance = iPhone.PlayGame(new { playId = 123, playName = "我要玩游戏" });//显示时间方法ViewBag.ShowTime = iPhone.ShowTime(DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss"));return View();}}
}

结果截图

 

五:Autofac支持AOP扩展IInterceptorSelector

以上扩展方法需要在方法上标注特性。扩展使用IInterceptorSelector时,只需要在Program中注册服务扩展接口时注册,无需在方法上标注特性。

扩展CusotmInterceptorSelector类

using Castle.DynamicProxy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;namespace Study_ASP.NET_Core_MVC.Interfaces
{public class CusotmInterceptorSelector : IInterceptorSelector{/// /// 让我们选择使用那个IInterceptor/// /// /// /// /// /// public IInterceptor[] SelectInterceptors(Type type, MethodInfo method, IInterceptor[] interceptors){return new IInterceptor[]{new CusotmInterceptor(),new CusotmCacheInterceptor()};}}
}

修改关键类Program.cs文件

using Autofac;
using Autofac.Extensions.DependencyInjection;
using Autofac.Extras.DynamicProxy;
using Castle.DynamicProxy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Study_ASP.Net_Core_MVC.Services;
using Study_ASP.NET_Core_MVC.Interfaces;
using Study_ASP.NET_Core_MVC.Models;//表示整个应用程序,调用CreateBuilder方法创建一个WebApplicationBuilder对象。
var builder = WebApplication.CreateBuilder(args);
//向管道容器添加注册中间件
//添加注册控制器视图中间件
builder.Services.AddControllersWithViews();
//添加注册Session中间件
builder.Services.AddSession();//添加注册Autofac中间件
//通过工厂替换整合Autofac
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
builder.Host.ConfigureContainer(containerBuilder =>
{//注册服务containerBuilder.RegisterType().As();containerBuilder.RegisterType().As();//支持AAOP扩展--接口扩展containerBuilder.RegisterType().As().EnableInterfaceInterceptors(new ProxyGenerationOptions(){Selector= new CusotmInterceptorSelector()});//注册切入逻辑containerBuilder.RegisterType();containerBuilder.RegisterType();containerBuilder.RegisterType();//注册控制器和抽象关系var controllerBaseType = typeof(ControllerBase);//支持属性注入到ControllerBase中containerBuilder.RegisterAssemblyTypes(typeof(Program).Assembly).Where(t => controllerBaseType.IsAssignableFrom(t) && t != controllerBaseType).PropertiesAutowired(new CusotmPropertySelector());
});
//添加注册控制器属性注入
builder.Services.Replace(ServiceDescriptor.Transient());//配置管道容器中间件,构造WebApplication实例
var app = builder.Build();
//判断是否是开发模式
if (!app.Environment.IsDevelopment())
{//向管道中添加中间件,该中间件将捕获异常、记录异常、重置请求路径并重新执行请求。app.UseExceptionHandler("/Shared/Error");//向管道中添加用于使用HSTS的中间件,该中间件添加了Strict Transport Security标头。默认值为30天app.UseHsts();
}
//向管道添加Session中间件
app.UseSession();
//向管道添加用于将HTTP请求重定向到HTTPS的中间件。
app.UseHttpsRedirection();
//向管道添加为当前请求路径启用静态文件服务
app.UseStaticFiles();
//向管道添加路由配置中间件
app.UseRouting();
//向管道添加鉴权中间件
app.UseAuthentication();
//向管道添加授权中间件
app.UseAuthorization();
//向管道添加默认路由中间件
app.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");
//向管道添加启动应用程序中间件
app.Run();

修改关键类IPhone

using Autofac.Extras.DynamicProxy;
using DocumentFormat.OpenXml.Drawing.Charts;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Study_ASP.NET_Core_MVC.Interfaces
{public interface IPhone{IMicroPhone MicroPhone { get; set; }IHeadPhone HeadPhone { get; set; }/// /// 打电话方法/// void Call();/// /// 发短信方法/// void Text();/// /// 玩游戏方法/// /// /// object PlayGame(object play);/// /// 显示当前时间信息/// /// 时间信息/// string ShowTime(string timeInfo);}public interface IMicroPhone { }public interface IHeadPhone { }
}

修改关键类ApplePhone

using Autofac.Extras.DynamicProxy;
using Study_ASP.NET_Core_MVC.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Study_ASP.Net_Core_MVC.Services
{public class ApplePhone : IPhone{public IMicroPhone MicroPhone { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }public IHeadPhone HeadPhone { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }public ApplePhone(){Console.WriteLine("{0}无参构造函数", this.GetType().Name);}public ApplePhone(IHeadPhone headPhone){Console.WriteLine("{0}有参构造函数:{1}", this.GetType().Name,headPhone);}/// /// 虚方法/// 打电话方法/// public virtual void Call(){Console.WriteLine("{0}打电话", this.GetType().Name);}/// /// 发短信方法/// public void Text(){Console.WriteLine("{0}发短信", this.GetType().Name);}/// /// 玩游戏方法/// /// /// public object PlayGame(object play){return new{Id = 123,Name = "VinCente",DateTime = DateTime.Now};}/// /// 显示当前时间信息/// /// 时间信息/// public string ShowTime(string timeInfo){Console.WriteLine("显示时间:{0}", timeInfo);return $"当前时间:{timeInfo}";}}
}

结果截图

相关内容

热门资讯

讽刺的词语解释及造句 讽刺的词语解释及造句  词目  讽刺  拼音  fěng cì  基本解释  用比喻、夸张等手法对人...
妄自菲薄造句 妄自菲薄造句9篇妄自菲薄造句1  1、当我们应对挑战时,既不宜妄自尊大,也不可妄自菲薄。  2、我们...
丘陵的解释及造句 丘陵的解释及造句  丘陵拼音  【注音】: qiu ling  丘陵解释  【意思】:连绵成片的小山...
“天会”造句 201、 我儿子保罗曾经对我说过,那个在青年队的14岁小正太总有一天会成为一个超顶级球员的。202、...
妻室的解释及造句 妻室的解释及造句  妻室拼音  【注音】: qi shi  妻室解释  【意思】:<书>妻子。  妻...
复兴的解释及造句 复兴的解释及造句  复兴拼音  【注音】: fu xing  复兴解释  【意思】:(1)衰落后再兴...
“谈笑风生”造句 1、他们谈笑风生地走进了校长办公室。2、人少言寡语不一定大智大勇,谈笑风生不一定是不严肃。3、我们走...
闷气的拼音解释及造句 闷气的拼音解释及造句  闷气拼音  【注音】: men qi  闷气解释  【意思】:2(mēqì)...
听差的拼音解释及造句 听差的拼音解释及造句  听差拼音  【注音】: ting cha  听差解释  【意思】:旧时指在机...
帘子的拼音解释及造句 帘子的拼音解释及造句  帘子拼音  【注音】: lian zi  帘子解释  【意思】:<口>帘②:...
慢慢地如何造句 慢慢地如何造句(精选70句)  造句是指用词语组织句子,下面是小编整理的慢慢地如何造句(精选70句)...
司空见惯的意思是什么-词语用... 其实人生便像是是平日司空见惯的太阳,它日复一日地遵循着东升西落的轨道。那么,司空见惯的具体意思是什么...
用不容置疑怎么造句 用不容置疑怎么造句用不容置疑怎么造句1  一、一切不容置疑,男人的霸气通过一种温暖的手段淋淳尽臻地表...
鼻音的解释及造句 鼻音的解释及造句  鼻音拼音  【注音】: bi yin  鼻音解释  【意思】:口腔气流通路阻塞,...
以此为鉴的意思并造句 以此为鉴的意思并造句  以此为鉴是一个常见的汉语词汇,是什么意思呢?要怎么造句?以下是小编整理的以此...
生财之道的造句 生财之道的造句(精选50句)  造句指懂得并使用字词,按照一定的句法规则造出字词通顺、意思完整、符合...
热症的解释及造句 热症的解释及造句  热症拼音  【注音】: re zheng  热症解释  【意思】:中医指发热、口...
博览群书造句   博览群书:广泛地阅读各种书。形容读书很多。下面是小编为你带来的博览群书造句,欢迎阅读。  博览群...
“拿下马来”造句 1、 说罢,先将庞昱拿下马来,差役掏出锁来锁上。2、 我会让Mas将这个消息封锁,等公司拿下马来西亚...
美轮美奂的意思和造句 美轮美奂的意思和造句  美轮美奂就是形容建筑物的高大、漂亮,我们看看下面的美轮美奂的意思和造句。  ...