zoukankan      html  css  js  c++  java
  • 【微服务No.3】AOP组件ASPectCore简单使用

    介绍:

    AspectCore是.NET标准的基于AOP的跨平台框架【github解释】。主要支持:对方面拦截器,依赖注入集成,Web应用程序,数据验证等的核心支持。

    使用实例:

    首先安装dll:

    Install-Package AspectCore.Core

    引用完dll就可以使用了,我们来创建基本的处理类:ErrorCommandAttribute

    介绍就不说了,理论我也知道的不多,直接上代码:

     class ErrorCommandAttribute : AbstractInterceptorAttribute
        {
            string _mess;
            public ErrorCommandAttribute(string methon)
            {
                _mess = methon;
            }
            /// <summary>
            /// 每个被拦截的方法中执行
            /// </summary>
            /// <param name="context"></param>
            /// <param name="next"></param>
            /// <returns></returns>
            public override async Task Invoke(AspectContext context, AspectDelegate next)
            {
                try
                {
                    Console.WriteLine("AddAsync方法开始前");
                    await next(context); // 执行被拦截的方法
                }
                catch (Exception)
                {
                    Console.WriteLine("AddAsync方法出错");
                    try
                    {
                        //Type[] mytypes = Assembly.GetExecutingAssembly().GetTypes();
                        Type type= typeof(User);//user 是类
                        var methom = Activator.CreateInstance(type);//反射创建类
                        MethodInfo methodinfo = type.GetMethod(_mess);//获取方法 _mess参数是自定义字符串为方法名称
                        methodinfo.Invoke(methom, null);//运行方法
                    }
                    catch (Exception ex)
                    {
    
                        throw;
                    }
                    throw;
                }
                finally
                {
                    Console.WriteLine("AddAsync方法结束");
                }
            }
        }
    View Code

    只简单介绍下方法的形式:Invoke

    该方法是继承AbstractInterceptorAttribute类之后必须实现得类;

    然后try:是在方法执行之前执行;所有我们在检测方法开始之前要想做一些操作可以写在这里

    catch:只有在检测的方法出现异常才会执行;这里是检测方法出异常了,需要做的操作,

    finally:都会执行

    我们再来看一下方法类:user

     public class User
        {
            [ErrorCommand("Error1")]
            public virtual async Task<int> AddAsync()
            {
                Console.WriteLine("开始方法:AddAsync");
                throw new Exception("出错了");
                return 0;
            }
            public async Task<int> Error1()
            {
                Console.WriteLine("开始方法:Error1");
                return 1;
            }
        }
    View Code

    很明显我们写的特性类只需要在需要检测的方法上面加特性就好了。这里特别注意就是,需要加特性的方法必须是虚方法,也就是必须加virtual 修饰。不然不会被调用。

    最后看一下如何使用方法:

    static void Main(string[] args)
            {
                Console.WriteLine("开始程序");
                //User user = new User();
                //user.AddAsync();
                ProxyGeneratorBuilder proxyGeneratorBuilder = new ProxyGeneratorBuilder();
                using (IProxyGenerator proxyGenerator = proxyGeneratorBuilder.Build())
                {
                    User p = proxyGenerator.CreateClassProxy<User>();
                    p.AddAsync();
                }
    
                Console.ReadLine();
            }
    View Code

    与正常的使用类方法看出来了:我们new User类的时候不是传统的方式,必须使用组件的CreateClassProxy方法;

    2018-06-23:

    修改拦截器方法:

    拦截方法从指定类型扩展为公共方法,自定义类型,这样就可以单独提取出来,不用每一个类型写一个类,可以自动获取到类型,然后可以重复使用:

     public override async Task Invoke(AspectContext context, AspectDelegate next)
            {
                try
                {
                    Console.WriteLine("AddAsync方法开始前");
                    await next(context); // 执行被拦截的方法
                }
                catch (Exception)
                {
                    Console.WriteLine("AddAsync方法出错");
                    //重复调用示例
                    ProxyGeneratorBuilder proxyGeneratorBuilder = new ProxyGeneratorBuilder();
                    using (IProxyGenerator proxyGenerator = proxyGeneratorBuilder.Build())
                    {
                        var baseClass = context.Proxy;
                        foreach (var item in baseClass.GetType().GetMethods())
                        {
                            if (item.Name.ToString() == _mess)
                            {
                                MethodInfo methodinfo = baseClass.GetType().GetMethod(_mess);
                                methodinfo.Invoke(baseClass, null);
                            }
                        }
                    }
    
                    throw;
                }
                finally
                {
                    Console.WriteLine("AddAsync方法结束");
                }
            }

    系列目录:

    微服务系列文章主要介绍微服务所使用到的一些技术和一些技术示例:

  • 相关阅读:
    Axure 8 注册码,市面上很多注册码都不行用,但是这个可以。
    SmartGit Mac、Liunx、Windows过期后破解方法
    iOS蓝牙4.0开发例子
    苹果发布【新开发语言】Swift
    iOS Web开发
    [置顶]JB开发之制作系统级Application
    mac 10.9 dock在多屏幕间移动
    IOS Application Security Testing Cheat Sheet
    看上去很美 国内CDN现状与美国对比
    iOS 企业证书发布app 流程
  • 原文地址:https://www.cnblogs.com/yanbigfeg/p/9210158.html
Copyright © 2011-2022 走看看