AOP之PostSharp4-实现类INotifyPropertyChanged植入

简介:

在前面几篇PostSharp的随笔,今天来一个简单的demo。PostSharp的其他内容将会在后面继续更新。

      如果我们了解wpf或者silverlight开发中的MVVM模式,就知道框架要求我们的ViewModel必须实现INotifyPropertyChanged,来得到属性改变的事件通知,更新UI。

实现INotifyPropertyChanged接口很简单,而且一沉不变,属于重复劳动。在这里我们将看看如何运用PostSharp来解决我们的重复劳动。当然这里只是一个demo演示,具体在项目开发中你直接实现INotifyPropertyChanged,或者AOP植入,这取决我个人和团队文化。

     在下面我们将会用到Postsharp的:

  1. IntroduceMember:向目标对象植入成员。
  2. IntroduceInterface:使得目标实现接口,参数接口类型。
  3. OnLocationSetValueAdvice:PostSharp的一种Advice Aspect。

   下面我就看看我们的代码是如何简洁来实现:

 
 
  1. using System;  
  2. using System.ComponentModel;  
  3.  
  4. using PostSharp.Aspects;  
  5. using PostSharp.Aspects.Advices;  
  6. using PostSharp.Extensibility;  
  7.  
  8. namespace PostSharpDemo  
  9. {  
  10.     [Serializable]  
  11.     [IntroduceInterface(typeof(INotifyPropertyChanged), OverrideAction = InterfaceOverrideAction.Ignore)]  
  12.     public class INotifyPropertyChangedAttribute : InstanceLevelAspect, INotifyPropertyChanged  
  13.     {  
  14.  
  15.         [OnLocationSetValueAdvice, MulticastPointcut(Targets = MulticastTargets.Property)]  
  16.         public void OnValueChanged(LocationInterceptionArgs args)  
  17.         {  
  18.             var current=args.GetCurrentValue();  
  19.             if ((args.Value != null && (!args.Value.Equals(current)))  
  20.                 || (current != null && (!current.Equals(args.Value))))  
  21.             {  
  22.                 args.ProceedSetValue();  
  23.                 this.OnRaisePropertyChange(args.Location.Name);  
  24.             }  
  25.         }  
  26.  
  27.         #region INotifyPropertyChanged 成员  
  28.  
  29.         [IntroduceMember(IsVirtual = true, OverrideAction = MemberOverrideAction.Ignore)]  
  30.         public event PropertyChangedEventHandler PropertyChanged;  
  31.  
  32.  
  33.  
  34.  
  35.         protected void OnRaisePropertyChange(string property)  
  36.         {  
  37.             if (PropertyChanged != null)  
  38.             {  
  39.                 PropertyChanged.Invoke(this.Instance, new PropertyChangedEventArgs(property));  
  40.             }  
  41.         }  
  42.         #endregion  
  43.     }  
  44.  

测试代码:

 

 
  1. static void Main(string[] args)   
  2.         {   
  3.  
  4.              Student stu = new Student();   
  5.             (stu as INotifyPropertyChanged).PropertyChanged += new PropertyChangedEventHandler(Program_PropertyChanged);   
  6.             stu.ID = 10;   
  7.             stu.Name = "wolf";   
  8.             stu.Sex = "Man";   
  9.             stu.ID = 2;   
  10.             Console.Read();   
  11.         }   
  12.  
  13.         static void Program_PropertyChanged(object sender, PropertyChangedEventArgs e)   
  14.         {   
  15.             Console.WriteLine(string.Format("property {0} has changed", e.PropertyName));   
  16.         }  
  17. [INotifyPropertyChanged]   
  18.    public class Student   
  19.    {   
  20.        public string Name   
  21.        { get; set; }   
  22.  
  23.        public string Sex   
  24.        { get; set; }   
  25.  
  26.        public int ID   
  27.        { get; set; }   
  28.    } 

运行效果如下:

附件下载:demo

本博客中相关文章有:

 





 本文转自 破狼 51CTO博客,原文链接:http://blog.51cto.com/whitewolfblog/835250,如需转载请自行联系原作者

相关文章
|
4月前
|
Kotlin
aop注解在整个类生效
aop注解在整个类生效
34 0
|
8月前
|
监控 前端开发 Java
30个类手写Spring核心原理之AOP代码织入(5)
前面我们已经完成了Spring IoC、DI、MVC三大核心模块的功能,并保证了功能可用。接下来要完成Spring的另一个核心模块—AOP,这也是最难的部分。
38 0
|
缓存 Java Spring
【小家Spring】Spring AOP核心类Pointcut解析,对PointcutExpression切点表达式解析原理分析(以AspectJExpressionPointcut为例)(上)
【小家Spring】Spring AOP核心类Pointcut解析,对PointcutExpression切点表达式解析原理分析(以AspectJExpressionPointcut为例)(上)
【小家Spring】Spring AOP核心类Pointcut解析,对PointcutExpression切点表达式解析原理分析(以AspectJExpressionPointcut为例)(上)
|
11月前
Spring-AOP @AspectJ进阶之绑定类注解对象
Spring-AOP @AspectJ进阶之绑定类注解对象
46 0
|
11月前
|
Java 测试技术 Spring
Spring-AOP 增强(Advice)5种类型和创建增强类
Spring-AOP 增强(Advice)5种类型和创建增强类
104 0
|
11月前
|
Java
SpringBoot AOP @Pointcut切入点execution表达式排除类中的具体方法
SpringBoot AOP @Pointcut切入点execution表达式排除类中的具体方法
336 0
|
XML Java 数据格式
【小家Spring】Spring AOP核心类Pointcut解析,对PointcutExpression切点表达式解析原理分析(以AspectJExpressionPointcut为例)(中)
【小家Spring】Spring AOP核心类Pointcut解析,对PointcutExpression切点表达式解析原理分析(以AspectJExpressionPointcut为例)(中)
|
缓存 Java 容器
Spring&SpringBoot源码系列 | AOP代理类的创建过程
本篇文章会介绍Spring中AOP的代理Bean的创建过程,对于AOP大家或多或少的都有些了解,无非就是创建代理,横切逻辑插入到目标方法执行的前后,原理就是如此,但是在实现上却十分复杂,下面一起看下 首先介绍下AOP的相关概念
380 0
Spring&SpringBoot源码系列 | AOP代理类的创建过程
【小家Spring】Spring AOP的核心类:AbstractAdvisorAutoProxy自动代理创建器深度剖析(AnnotationAwareAspectJAutoProxyCreator)(下)
【小家Spring】Spring AOP的核心类:AbstractAdvisorAutoProxy自动代理创建器深度剖析(AnnotationAwareAspectJAutoProxyCreator)(下)
【小家Spring】Spring AOP的核心类:AbstractAdvisorAutoProxy自动代理创建器深度剖析(AnnotationAwareAspectJAutoProxyCreator)(下)
|
Java Spring 容器
【小家Spring】Spring AOP的核心类:AbstractAdvisorAutoProxy自动代理创建器深度剖析(AnnotationAwareAspectJAutoProxyCreator)(中)
【小家Spring】Spring AOP的核心类:AbstractAdvisorAutoProxy自动代理创建器深度剖析(AnnotationAwareAspectJAutoProxyCreator)(中)
【小家Spring】Spring AOP的核心类:AbstractAdvisorAutoProxy自动代理创建器深度剖析(AnnotationAwareAspectJAutoProxyCreator)(中)