使用.net core中的類DispatchProxy實現AOP

在軟件業,AOP爲Aspect Oriented Programming的縮寫,意爲:面向切面編程,經過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。AOP是軟件開發中的一個熱點,利用AOP能夠對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度下降,提升程序的可重用性。編程

好比說三層的調用:UI => BLL => DAL,正常來講咱們會在UI層調用BLL層某個類的某個方法,而後BLL層某個類的某個方法又會調用DAL層某個類的某個方法,能夠說一般狀況下咱們都是這麼幹的,AOP能夠作到在調用BLL層任意方法以前或以後作一些統一的邏輯處理,若是說UI調BLL、BLL調DAL是縱向的話,那麼AOP就是橫向的緩存

AOP的典型應用場景:日誌記錄、權限驗證、異常處理、緩存等ide

在.net core中有DispatchProxy類,提供實例化代理對象和處理其方法調度的機制,藉助它能夠實現AOP,直接看示例spa

 

定義一個消息接口IMessage,其中有一個發送消息Send和接收消息Receive的方法定義:.net

    public interface IMessage
    {
        void Send(string content);
        void Receive(string content);
    }

 

定義電子郵件類EmailMessage實現消息接口IMessage,實現使用電子郵件發送和接收消息:代理

    public class EmailMessage : IMessage
    {
        public void Send(string content)
        {
            Console.WriteLine("Send Email:" + content);
        }
        public void Receive(string content)
        {
            Console.WriteLine("Receive Email:" + content);
        }
    }

 

定義日誌攔截器LogDispatchProxy 繼承自DispatchProxy類,重寫基類Invoke方法並在目標方法調用先後加上所需業務邏輯;而後定義TargetClass屬性,該屬性是目標方法所屬類的實例日誌

    public class LogDispatchProxy : DispatchProxy
    {
        public object TargetClass { get; set; }
        protected override object Invoke(MethodInfo targetMethod, object[] args)
        {
            Write("方法執行前");
            var result = targetMethod.Invoke(TargetClass, args);
            Write("方法執行後");
            return result;
        }

        private void Write(string content)
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine(content);
            Console.ResetColor();
        }
    }

 

使用:code

    class Program
    {
        static void Main(string[] args)
        {
            //使用DispatchProxy類的靜態方法Create生成代理類,其中Create是個泛型方法,泛型有兩個值,第一個值必須是接口,第二個值必須是DispatchProxy的子類
            IMessage messageDispatchProxy = DispatchProxy.Create<IMessage, LogDispatchProxy>();
            //建立一個實現了IMessage接口的類的實例,並賦值給代理類的TargetClass屬性
            ((LogDispatchProxy)messageDispatchProxy).TargetClass = new EmailMessage();
            messageDispatchProxy.Send("早上好");
            messageDispatchProxy.Receive("中午好");

            Console.ReadKey();
        }
    }

個人理解:經過DispatchProxy.Create建立的代理類messageDispatchProxy 就是一個繼承自LogDispatchProxy的類,而且利用咱們提供的的實例實現了IMessage接口,因此messageDispatchProxy能夠強轉爲LogDispatchProxy和IMessage對象

 

執行結果blog

至此,咱們沒有經過任何第三方類庫,本身實現了一個AOP

相關文章
相關標籤/搜索