AOP面向切面的编程使用Interceptor内置的容器进行属性注入

Posted 龙腾一族至尊龙骑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AOP面向切面的编程使用Interceptor内置的容器进行属性注入相关的知识,希望对你有一定的参考价值。

AOP面向切面的编程使用Interceptor内置的容器进行属性注入

1. NuGet程序包管理添加Castle Core,主要用于拦截器的使用,Startup ConfigureServices中添加如下内容

public void ConfigureServices(IServiceCollection services)

#region Controller控制器中的属性注入
//把控制器作为服务注册,然后使用它内置的ioc来替换原来的控制器的创建器,这样就可以使用IOC来依赖注入和控制反转创建对应的控制器
services.AddControllersWithViews().AddControllersAsServices();
services.Replace(ServiceDescriptor.Transient<IControllerActivator, CustomServiceBaseControllerActivator>());

services.AddTransient<ITestA, TestA>();
services.AddTransient<ITestB, TestB>();
#endregion

 

2. 自定义拦截器和aop切面编程的拦截器的扩展放方法

using Castle.DynamicProxy;
using System;

namespace WebAppTest.Extensions

/// <summary>
/// 自定义拦截器
/// </summary>
public class CustomInterceptor : StandardInterceptor

protected override void PerformProceed(IInvocation invocation)

Console.WriteLine($"方法invocation.Method.Name执行前。。。。");
base.PerformProceed(invocation);
Console.WriteLine($"方法invocation.Method.Name执行后。。。。");


protected override void PreProceed(IInvocation invocation)

base.PreProceed(invocation);


protected override void PostProceed(IInvocation invocation)

base.PostProceed(invocation);



/// <summary>
/// aop切面编程的拦截器的扩展放方法
/// </summary>
public static class AOPExtension

public static object AOP(this object obj, Type interfaceType)

ProxyGenerator proxyGenerator = new ProxyGenerator();
CustomInterceptor customInterceptor = new CustomInterceptor();
return proxyGenerator.CreateInterfaceProxyWithTarget(interfaceType, obj, customInterceptor);


 

3. 控制器Controller中,使用拦截器,接口服务标记拦截器需要拦截的特性

using WebAppTest.CustomAttrributes;

namespace WebAppTest.Services

public interface ITestA

//接口服务标记拦截器需要拦截的特性
[LogBeforeAttribute]
[LogAfterAttribute]
void Show();



//控制器Controller中,使用拦截器
public IActionResult Index()

//_testA.Show();
_testB.Show();
((ITestA)_testA.AOP(typeof(ITestA))).Show();
return View();

 

4. 自定义特性标记

using Castle.DynamicProxy;
using System;

namespace WebAppTest.CustomAttrributes

#region 自定义的控制器创建对象,以便使用ioc创建控制器,Controller控制器属性注入和Controller控制器方法注入 其实IOC就是一个字典Dictionary
/// <summary>
/// 属性的特性标记,主要用于标记属性
/// </summary>
[AttributeUsage(AttributeTargets.Property)]
public class CustomPropertyAttribute : Attribute



/// <summary>
/// 方法的特性标记,主要用于标记方法
/// </summary>
[AttributeUsage(AttributeTargets.Method)]
public class CustomMethodAttribute : Attribute


#endregion


#region 拦截器特性111
///// <summary>
///// 标记方法拦截前
///// </summary>
//public class LogBeforeAttribute : Attribute
//
// public void Do()
// Console.WriteLine("LogBeforeAttribute执行---前");
//
//

///// <summary>
///// 标记方法拦截中
///// </summary>
//public class LogMonitorAttribute : Attribute
//
//

///// <summary>
///// 标记方法拦截后
///// </summary>
//public class LogAfterAttribute : Attribute
//
// public void Do()
//
// Console.WriteLine("LogAfterAttribute执行---后");
//
//
#endregion

#region 拦截器特性抽象
public abstract class AbstractAttribute : Attribute

public abstract Action Do(IInvocation invocation, Action action);


/// <summary>
/// 标记方法拦截前
/// </summary>
public class LogBeforeAttribute : AbstractAttribute

public override Action Do(IInvocation invocation, Action action)

return () =>

action.Invoke();
//添加需要处理的操作
Console.WriteLine($"LogBeforeAttribute执行---前,invocation.Method.Name");
;



/// <summary>
/// 标记方法拦截中
/// </summary>
public class LogMonitorAttribute : AbstractAttribute

public override Action Do(IInvocation invocation, Action action)

return () =>

Console.WriteLine($"LogMonitorAttribute执行---中,invocation.Method.Name");
//添加需要处理的操作
action.Invoke();
//添加需要处理的操作
Console.WriteLine($"LogMonitorAttribute执行---中,invocation.Method.Name");
;



/// <summary>
/// 标记方法拦截后
/// </summary>
public class LogAfterAttribute : AbstractAttribute

public override Action Do(IInvocation invocation, Action action)

return () =>

Console.WriteLine($"LogAfterAttribute执行---后,invocation.Method.Name");
//添加需要处理的操作
action.Invoke();
;


#endregion

 

5.  使用不同的需求,例如在某个方法前拦截,方法后来拦截,方法中拦截

using Castle.DynamicProxy;
using System;
using System.Reflection;
using WebAppTest.CustomAttrributes;

namespace WebAppTest.Extensions

#region 自定义拦截器-可以拦截所有接口方法,都一样不能更具需要特殊定制,如:方法前拦截,方法后来拦截,方法中拦截,没有办法做到
///// <summary>
///// 自定义拦截器-可以拦截所有接口方法,都一样不能更具需要特殊定制,如:方法前拦截,方法后来拦截,方法中拦截,没有办法做到
///// </summary>
//public class CustomInterceptor : StandardInterceptor
//
// protected override void PerformProceed(IInvocation invocation)
//
// Console.WriteLine($"方法invocation.Method.Name执行前。。。。");
// base.PerformProceed(invocation);
// Console.WriteLine($"方法invocation.Method.Name执行后。。。。");
//

// protected override void PreProceed(IInvocation invocation)
//
// base.PreProceed(invocation);
//

// protected override void PostProceed(IInvocation invocation)
//
// base.PostProceed(invocation);
//
//
#endregion

#region 方法前拦截,方法后来拦截,方法中拦截
public class CustomInterceptor : StandardInterceptor

protected override void PerformProceed(IInvocation invocation)

Console.WriteLine($"方法invocation.Method.Name执行前。。。。");
Action action = () => base.PerformProceed(invocation);
var customAtts = invocation.Method.GetCustomAttributes<AbstractAttribute>();
foreach (var customAtt in customAtts)

action = customAtt.Do(invocation, action);

action.Invoke();
Console.WriteLine($"方法invocation.Method.Name执行后。。。。");


//protected override void PreProceed(IInvocation invocation)
//
// var customAtt = invocation.Method.GetCustomAttribute<LogBeforeAttribute>();
// customAtt.Do();
// base.PreProceed(invocation);
//

//protected override void PostProceed(IInvocation invocation)
//
// var customAtt = invocation.Method.GetCustomAttribute<LogBeforeAttribute>();
// customAtt.Do();
// base.PostProceed(invocation);
//

#endregion

/// <summary>
/// aop切面编程的拦截器的扩展放方法
/// </summary>
public static class AOPExtension

public static object AOP(this object obj, Type interfaceType)

ProxyGenerator proxyGenerator = new ProxyGenerator();
CustomInterceptor customInterceptor = new CustomInterceptor();
return proxyGenerator.CreateInterfaceProxyWithTarget(interfaceType, obj, customInterceptor);


 

龙腾一族至尊龙骑

以上是关于AOP面向切面的编程使用Interceptor内置的容器进行属性注入的主要内容,如果未能解决你的问题,请参考以下文章

Spring系列Spring中AOP面向切面的编程(动态代理)

spring 之 AOP

面向切面的Spring

Spring AOP梳理

SpringAOP的应用实例与总结

java中aop模式是怎样将切面织入业务方法中的?