AOP 切面思想

  • 什么是AOP?引用百度百科:AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。实现AOP主要由两种方式,
    • 一种是编译时静态织入,优点是效率高,缺点是缺乏灵活性,.net下postsharp为代表者(好像是付费了。。)。
    • 另一种方式是动态代理,优点是灵活性强,但是会影响部分效率,动态为目标类型创建代理,通过代理调用实现拦截。

AOP能做什么

  • 常见的用例是事务处理、日志记录…

常见的AOP都是配合在Ioc的基础上进行操作,上边咱们讲了Autofac这个简单强大的Ioc框架,下面就讲讲Autofac怎么实现AOP。Autofac的AOP是通过Castle(也是一个容器)项目的核心部分实现的,名为Autofac.Extras.DynamicProxy,顾名思义,其实现方式为动态代理。当然AOP并不一定要和依赖注入在一起使用,自身也可以单独使用。

是不是很拗口,没关系,网上有一个博友的图片,大概讲了AOP切面编程:

切面思想 - 图1

定义服务接口与实现类

在API层中添加对该接口引用

添加AOP拦截器

切面思想 - 图2

  • 1、继承接口IInterceptor
  • 2、实例化接口IINterceptor的唯一方法Intercept
  • 3、void Proceed();表示执行当前的方法
  • 4、执行后,输出到日志文件。

将拦截器注入容器,代理服务

还记得昨天的Autofac容器 ConfigureContainer 么,我们继续对它进行处理:

  • 1、先把拦截器注入容器;
  • 2、然后对程序集的注入方法中匹配拦截器服务;
  1. public void ConfigureContainer(ContainerBuilder builder)
  2. {
  3. var basePath = Microsoft.DotNet.PlatformAbstractions.ApplicationEnvironment.ApplicationBasePath;
  4. //直接注册某一个类和接口
  5. //左边的是实现类,右边的As是接口
  6. builder.RegisterType<AdvertisementServices>().As<IAdvertisementServices>();
  7. builder.RegisterType<BlogLogAOP>();//可以直接替换其他拦截器!一定要把拦截器进行注册
  8. //注册要通过反射创建的组件
  9. var servicesDllFile = Path.Combine(basePath, "Blog.Core.Services.dll");
  10. var assemblysServices = Assembly.LoadFrom(servicesDllFile);
  11. builder.RegisterAssemblyTypes(assemblysServices)
  12. .AsImplementedInterfaces()
  13. .InstancePerLifetimeScope()
  14. .EnableInterfaceInterceptors()
  15. .InterceptedBy(typeof(BlogLogAOP));//可以放一个AOP拦截器集合
  16. }
  • 注意其中的两个方法

    • .EnableInterfaceInterceptors()//对目标类型启用接口拦截。拦截器将被确定,通过在类或接口上截取属性, 或添加 InterceptedBy ()
    • .InterceptedBy(typeof(BlogLogAOP));//允许将拦截器服务的列表分配给注册。
  • 说人话就是,将拦截器添加到要注入容器的接口或者类之上。