【微服務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方法結束");
            }
        }

 

系列目錄:

微服務系列文章主要介紹微服務所使用到的一些技術和一些技術示例:

相關文章
相關標籤/搜索