权限控制:AOP可以用来强制执行安全策略,确保只有授权的用户能够执行特定操作。
Install-Package Autofac Install-Package Autofac.Extras.DynamicProxy2这些库将允许我们使用Autofac容器来进行依赖注入,并通过AspectC实现AOP。
using System; // 堆代码 duidaima.com public interface ICalculator { int Add(int a, int b); } public class Calculator : ICalculator { public int Add(int a, int b) { return a + b; } }Calculator类实现了ICalculator接口,提供了一个用于加法运算的Add方法。
using System; public interface ILoggingAspect { void LogMethodInvocation(string methodName, object[] arguments); void LogMethodResult(string methodName, object result); }ILoggingAspect接口包含了两个方法,分别用于记录方法调用和记录方法结果。
using System; public class LoggingAspect : ILoggingAspect { public void LogMethodInvocation(string methodName, object[] arguments) { Console.WriteLine($"方法 {methodName} 被调用,参数为: {string.Join(", ", arguments)}"); } public void LogMethodResult(string methodName, object result) { Console.WriteLine($"方法 {methodName} 返回结果: {result}"); } }LoggingAspect类实现了ILoggingAspect接口,它包含了实际的日志记录逻辑。在这个示例中,我们简单地将方法调用和结果写入控制台。
using System; using Autofac; using Autofac.Extras.DynamicProxy; public class AutofacConfig { public static IContainer Configure() { var builder = new ContainerBuilder(); // 注册服务 (Calculator) 和切面 (LoggingAspect) builder.RegisterType<Calculator>().As<ICalculator>().EnableInterfaceInterceptors(); builder.RegisterType<LoggingAspect>().As<ILoggingAspect>(); // 注册拦截器 builder.Register(c => new LogInterceptor(c.Resolve<ILoggingAspect>())); return builder.Build(); } }在上述配置中,我们使用builder.RegisterType方法注册了Calculator服务和LoggingAspect切面,并启用了接口拦截。然后,我们注册了一个名为LogInterceptor的拦截器,它将在方法调用前后执行日志记录。
using System; using Castle.DynamicProxy; public class LogInterceptor : IInterceptor { private readonly ILoggingAspect _loggingAspect; public LogInterceptor(ILoggingAspect loggingAspect) { _loggingAspect = loggingAspect; } public void Intercept(IInvocation invocation) { // 获取方法名称和参数 var methodName = invocation.Method.Name; var arguments = invocation.Arguments; // 记录方法调用 _loggingAspect.LogMethodInvocation(methodName, arguments); // 继续执行原始方法 invocation.Proceed(); // 获取方法结果 var result = invocation.ReturnValue; // 记录方法结果 _loggingAspect.LogMethodResult(methodName, result); } }在上述拦截器中,我们获取了方法的名称和参数,并在方法调用前后执行了日志记录操作。通过invocation.Proceed()方法,我们继续执行原始方法。最后,我们记录了方法的结果。
using System; using Autofac; class Program { static void Main(string[] args) { // 配置Autofac容器 var container = AutofacConfig.Configure(); // 解析Calculator服务 var calculator = container.Resolve<ICalculator>(); // 执行计算 int result = calculator.Add(5, 3); Console.WriteLine($"计算结果: {result}"); Console.ReadLine(); } }在Program类中,我们首先配置了Autofac容器,然后使用容器解析了ICalculator服务。接下来,我们调用calculator.Add(5, 3)来执行加法操作,而AOP将自动记录方法调用和结果。