【微服务No.3】AOP组件ASPectCore简单使用

介绍:html

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

使用实例:

首先安装dll:github

Install-Package AspectCore.Corewindows

引用完dll就能够使用了,咱们来建立基本的处理类:ErrorCommandAttribute框架

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

 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

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

该方法是继承AbstractInterceptorAttribute类以后必须实现得类;微服务

而后try:是在方法执行以前执行;全部咱们在检测方法开始以前要想作一些操做能够写在这里ui

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

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方法结束");
            }
        }

 

系列目录:

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

相关文章
相关标签/搜索