代码改变世界

随笔分类 -  AOP/IOC

Aspectj 实现Method条件运行

2013-07-07 11:23 by 破狼, 3300 阅读, 收藏, 编辑
摘要: 最近我花了半个小时实现了一个Method的按自定义条件运行的plugin,Condition-Run 。实现场景是由于我所工作的客户经常会是在同一个代码集上实现多个Brand,所以有些功能只会限制是几个brand调用,而其他的调用则不该调用。还有因为持续交互,我们会不停的release新的功能得到快速的反馈,在这前提下我们会经常遇见在我们刚开发完一个brand的产品代码,就要面临release,所以我们希望其不该对其他的brand产生影响。 面对这样的需求初级程序员有些人肯定会觉得没什么了不起的啊,不就是几个if/else或者switch/case。我和我的团队对代码有一种天生的洁癖,对于太. 阅读全文

Aspect Oriented Programming杂谈

2012-10-28 16:45 by 破狼, 4731 阅读, 收藏, 编辑
摘要: 至今Aspect Oriented Programming已经被开发人员所熟知,其简写AOP,译为面向方面编程(也有称面向切面编程)。其产生于90年代Xerox PARC实验室编程范式。被称为oop的延续,oop主要针对业务处理过程的领域问题抽象封装,形成领域对象,更好的描述自然领域问题。而aop主要处理业务处理过程中处理逻辑步骤分离,减少业务逻辑的耦合性,是的我们的开发人员在开发过程中只需关心领域的核心实际逻辑。在结构化编程(SP)中提出了SOC(分离关注点),并一直被称为是面对复杂软件最行之有效的方法之一,并被努力应用于不同的软件实践,比如表现层模式MVC,MVP,PM,面向服务编程SO. 阅读全文

流畅的验证组件:FluentValidation

2012-05-27 22:33 by 破狼, 14277 阅读, 收藏, 编辑
摘要: 这里要介绍一款与企业库VAB(Validation Application Block),ASP.NET MVC基于Attribute声明式验证所不同的验证组件,FluentValidation,其利用表达式语法链式编程,使得验证组件与实体分开。我喜欢他的原因是喜欢表达式,喜欢链式的感觉,大有一气呵成之意。 进入今天的主题首先如果你还没有这款组件,你可以利用VS2010的NuGet安装,(如果不会的请安装上篇开源DataBase组件:FluentMigrator中提到的方式安装),命令为: 现在我们可以开始体验了,实体类do任然是上节的Orders: do:publiccl... 阅读全文

面向设计原则理解

2012-05-08 00:47 by 破狼, 6051 阅读, 收藏, 编辑
摘要: 面向对象设计(OOD)核心原则让我的程序模块达到“高内聚低耦合”,这是来自于30年前兴起的结构化设计(structured Design),但是同样适用于我们的OOD。1.高内聚: 高内聚是指某个特定模块(程序,类型)都应完成一系列相关功能,描述了不同程序,类型中方法,方法中不同操作描述的逻辑之间... 阅读全文

IOC/AOP随笔目录

2012-02-12 23:28 by 破狼, 8196 阅读, 收藏, 编辑
摘要: 在当前软件开发OO设计中,面对软件需求的各种潜在变化,我们可能会采用领域驱动开发,把我们的各个业务逻辑分层次隔离解除耦合,这就出现了N层架构(这面值得是逻辑上的分层,当然我们的逻辑分层层次需要比物理架构层次多),这样将会使得我们的软件能够适应更多的需求变化。关于领域驱动开发的实例网上都很多,不得不推荐的是微软开源实例项目的NLayerApp:http://microsoftnlayerapp.codeplex.com/。 然而在于我们的逻辑分层的每一层次之间的耦合度解耦也是一个常见的问题.这样在层次的变化中我们需要实现不变更服务层次,这是我们的设计必须依赖于不变接口(抽象)。对于分层的接口对. 阅读全文

WCF利用企业库Unity框架的IOC层次解耦

2012-02-07 23:23 by 破狼, 5638 阅读, 收藏, 编辑
摘要: 由于工作几个月来框架开发已经好久没写博客了,今天想抽点时间出来冒泡。在领域驱动开发中SOA已经成为我们开发的主流技术,在面对当前众多的UI框架选择(asp.net mvc,silverlight,wpf,winform,wp7等一些列甚至跨语言),我们能够重用和抽象的业务逻辑是不会变化的,为了屏蔽这些UI的复杂性和差异性,我们可能会采用诸如wcf soap的服务发布。再说在领域驱动开发中我们肯定会把各个逻辑分层次隔离解除耦合,这就出现了N层架构,在于我们的每一层次之间的耦合度当前流程的解决方案IOC框架,以及业务解耦AOP。这里要解决的是SOA框架WCF和IOC框架的结合。 WCF框架是一个. 阅读全文

AOP之PostSharp7-解决IOC 不能直接new问题,简化IOC开发和IOC对象LazyLoad

2011-12-18 21:50 by 破狼, 2937 阅读, 收藏, 编辑
摘要: 经过几节的postsharp基础和每节的一个应用实例,已经基本PostSharp应用的能力,PostSharp主要是简化我们的开发,让编译器时候给我注入重复疲劳代码。 在今天我们的demo是,关于ioc(控制反转)的问题,ioc框架我们都会从ioc容器中取得我们的ioc对象注入,所以我们不能直接new对象得到我们的实例,必须Resolve。我一直都是很懒得人,既然有了PostSharp就的好好利用起来。大部份ioc逻辑是从以前的一篇利用Attribute简化Unity框架IOC注入转过来的,注入支持自定义配置文件,我个人不喜欢把配置信息全部写在一个web.config/app.config.. 阅读全文

AOP之PostSharp6-EventInterceptionAspect(事件异步调用)

2011-12-13 19:50 by 破狼, 2246 阅读, 收藏, 编辑
摘要: 在上几章我们讨论了方法属性字段的aspect,现在我们再来看看事件机制的aspect。和字段,属性location一样,在c#中字段也可以转化为方法名为add,remove的方法处理,所以对于事件的aspect,同样类似于我们的方法。我们先看看EventInterceptionAspect的定义: aspect类包含我们对于事件aspect所必要的注册,取消,调用的注入。其参数定义如下: 为我们提供了,ProceedAddHandler,ProceedInvokeHandler,ProceedRemoveHandler的事件处理代理。同样包含来自AdviceArgs的Instance对象。 . 阅读全文

AOP之PostSharp5-LocationInterceptionAspect

2011-12-11 14:50 by 破狼, 2236 阅读, 收藏, 编辑
摘要: 这节我们要讨论的是PostSharp的LocationInterceptionAspect,PostSharp官方把Property和Field成为Location。所以LocationInterceptionAspect就是为了实现Property和Field的拦截。在我们前面讨论了关于方法OnMethodBoundaryAspect的aspect,我们很容易想到,在c#中Property就是一个编译时分为Get和Set两个方法,对于property的aspect就类似于了我们的Method的aspect。而对于Field的aspect同样可以转换为对Property的aspect。下面我. 阅读全文

AOP之PostSharp4-实现类INotifyPropertyChanged植入

2011-12-10 20:58 by 破狼, 2704 阅读, 收藏, 编辑
摘要: 在前面几篇PostSharp的随笔,今天来一个简单的demo。PostSharp的其他内容将会在后面继续更新。 如果我们了解wpf或者silverlight开发中的MVVM模式,就知道框架要求我们的ViewModel必须实现INotifyPropertyChanged,来得到属性改变的事件通知,更新UI。实现INotifyPropertyChanged接口很简单,而且一沉不变,属于重复劳动。在这里我们将看看如何运用PostSharp来解决我们的重复劳动。当然这里只是一个demo演示,具体在项目开发中你直接实现INotifyPropertyChanged,或者AOP植入,这取决我个人和团队文化. 阅读全文

AOP之PostSharp3-MethodInterceptionAspect

2011-12-04 23:46 by 破狼, 3157 阅读, 收藏, 编辑
摘要: 在上两篇我们介绍了OnExceptionAspect和OnMethodBoundaryAspect ,在这节我们将继续了解MethodInterceptionAspect,他为我们提供了关于方法处理的AOP切入,不同于OnMethodBoundaryAspect,他不是边界,是方法体。有了我们可以在我们的方法切入aspect很多有用的信息,比如将同步方法变为异步,防止多次点击重复提交,winform,wpf的多线程调用UI(参见PostSharp - Thread Dispatching(GUI多线程)),长时间操作在超过用户接受时间弹出进度条等等有用的关于用户体验和业务逻辑功能,简化我们的. 阅读全文

AOP之PostSharp2-OnMethodBoundaryAspect

2011-12-04 19:03 by 破狼, 4550 阅读, 收藏, 编辑
摘要: 在上一篇中我们了解了简单的OnExceptionAspectAOP面向方向切入,在第一节中我们将继续我们的PostSharp AOP系列的OnMethodBoundaryAspect方法行为的切入,这也是我们常用的AOP切入。 OnMethodBoundaryAspect顾名思义其为对方法边界的切入,定义如下:在这里提供了四个方法边界点为我们切入。我们可以很轻松的对方法权限,执行时间,参数合法性等aspect。aspect传入参数MethodExecutionArgs给我如下信息,同时还包括父类AdviceArgs的Instance属性,实例方法才有值,静态方法则为null,这里还需要说一下. 阅读全文

AOP之PostSharp初见-OnExceptionAspect

2011-12-04 01:35 by 破狼, 6224 阅读, 收藏, 编辑
摘要: PostSharp 这个静态植入的aop框架我就不多说了,在以前的aop文件,我们也尝试用MSBuild+Mono.Cicel理解静态植入AOP的原理。最近公司准备购买Postsharp做一些AOP,减少开发是代码量,至于选择AOP相信也不用多说。我也在今天重新了解了些Postsharp最新版更新,这阵子的博客更新也少了,所以准备在MSBuild+Mono.Cicel的基础上再一些Postsharp系列。今天既然是初见,那么我们就从最简单的OnExceptionAspect开始。一:OnExceptionAspect起定义如下: 先写Aspect Attribute:View Code [S. 阅读全文

利用Attribute简化Unity框架IOC注入

2011-11-29 22:47 by 破狼, 8145 阅读, 收藏, 编辑
摘要: 在我们的领域驱动设计(DDD)开发中,我们经常需要IOC框架使得我的框架依赖翻转,依赖抽象,避免直接new依赖于我们的具体实现。这些使得我们的框架整个项目结构不变,很方便的改变具体实现,使得项目提供可测试性,模块之间实现高内聚低耦合,减少我们的后期维护成本。IOC框架一般基于容器,在容器中存储着各个抽象和具体实现的依赖关系,当我们需要发出请求的时候,IOC框架会在当前容器中找到我们所需要的具体实现返回给我们,当然这里还有DI注入(属性,方法,构造),在我们的使用者(客户端)不需要了解具体实现,如何初始化,如何流转等具体,只需明白我们的契约接口暴露给我们的服务,IOC框架是解决抽象和具体直接的. 阅读全文

PostSharp - Thread Dispatching(GUI多线程)

2011-08-18 11:06 by 破狼, 3208 阅读, 收藏, 编辑
摘要: 在我们的桌面应用程序(不管是WinForm还是WPF)我们都必须去面对线程的dispatching。在window图形用户系统中像基于.net的WinForm或者是WPF都有一个唯一的主线程。他们是基于Win32消息循环队列机制处理UI界面的事件(又分为事件的钻取和隧道)、渲染。所以在一个长时间的事件处理中,我们的UI不会得到及时的更新和响应,甚至会出现假死状态。所以在GUI编程有这么一条黄金规则:不要再GUI主线程处理长时间的应用。对于长时间的处理,我们需要应用在异步线程中,并且通常认为最佳的实践并不是为每一个操作创建一个线程,而是放入线程池队列中。注:一下代码都分析了WinForm,但是贴 阅读全文

MSBuild + MSILInect实现编译时AOP-改变前后对比

2011-08-09 23:20 by 破狼, 2844 阅读, 收藏, 编辑
摘要: 实现静态AOP,就需要我们在预编译时期,修改IL实现对代码逻辑的修改。Mono.Cecil就是一个很好的IL解析和注入框架,参见编译时MSIL注入--实践Mono Cecil(1)。 我的思路为:在编译时将加有继承制MethodInterceptBaseAttribute标签的原方法,重新组装成一个方法(并加上[CompilerGenerated]标签),在加入横切注入接口前后代码,调用此方法。比如代码:[TestAOPAttribute(Order=1)]publicClass1TestMethod1(inti,intj,Class1c){Console.WriteLine("ok 阅读全文

MSBuild + MSILInect实现编译时AOP之预览

2011-08-09 14:05 by 破狼, 3338 阅读, 收藏, 编辑
摘要: 在本文之前的前几篇浅谈.NET编译时注入(C#-->IL)、浅谈VS编译自定义编译任务—MSBuild Task(csproject)、编译时MSIL注入--实践Mono Cecil(1)已经讨论了MSBuild和Mono.Cicel。在这里我们将会利用它来实现一个简单的编译时AOP注入机制(这里所说的编译时是指c#到MSIL的预编译过程)。我更倾向于像EL(微软企业库框架)这类动态AOP。编译时AOP有PostSharp这种被称之为静态AOP框架,其优势在于直接代码语句,性能更好,它不需要我们多余的代码,像EL这种动态AOP,一般我们是不能直接new一个对象,需要容器(Containe 阅读全文

编译时MSIL注入--实践Mono Cecil(1)

2011-07-28 21:34 by 破狼, 13138 阅读, 收藏, 编辑
摘要: 紧接上两篇浅谈.NET编译时注入(C#-->IL)和浅谈VS编译自定义编译任务—MSBuild Task(csproject),在第一篇中我们简单研究了c#语法糖和PostSharp的MSIl注入,紧接第二篇中我们介绍了自定义MSBuild编译任务(记得有位老兄发链接用 MSBuild自动发布Silverlight xap ,我想说的我做的是自定义编译任务,不是什么发布,MSBuild本就是一个发布工具)。之所以在此前介绍编译Task是因为我讲介绍的就是利用MSBuild和MSILInject制作静态注入式AOP,想成熟的产品PostSharp,当然我也不会去重造轮子,但需要明白起原理和 阅读全文

浅谈VS编译自定义编译任务—MSBuild Task(csproject)

2011-07-27 23:17 by 破狼, 15096 阅读, 收藏, 编辑
摘要: 在上一篇浅谈.NET编译时注入(C#-->IL)中我们简单的反编译查看了几种c#语法糖和PostSharp在编译成IL时为我做的MSIL注入。紧接着在这节,要来看的就是MSBuild Task。在我们的代码预编译过程中我们可以创建我们自己的任务Task。下面我们就开始做一个简单的Task。1:首先需要添加Microsoft.Build.Utilities.v3.5.dll和Microsoft.Build.Framework.dll中引用。在Microsoft.Build.Framework中为我们定义了接口ITask,自定义任务需要去实现这个契约。其定义如下:publicinterfac 阅读全文

浅谈.NET编译时注入(C#-->IL)

2011-07-26 21:27 by 破狼, 11321 阅读, 收藏, 编辑
摘要: .NET是一门多语言平台,这是我们所众所周知的,其实现原理在于因为了MSIL(微软中间语言)的一种代码指令平台。所以.NET语言的编译就分为了两部分,从语言到MSIL的编译(我喜欢称为预编译),和运行时的从MSIL到本地指令,即时编译(JIT)。JIT编译分为经济编译器和普通编译器,在这里就不多说了,不是本文的重点。本文主要讨论下预编译过程中我们能做的改变编译情况,改变生成的IL,从编译前后看看微软C#3.0一些语法糖,PostSharp的静态注入等等。1:我们先来看看最简单的var:C#:publicvoidTestVar(){ vari=0; Console.WriteLine(i);}. 阅读全文