很容易想到的办法就是在具体的业务领域里的工作流引擎从WorkflowEngine派生并覆写它的某些方法。值得一提的是,无论是面向过程、面向对象还是面向方面的解决方案都可以达到预期的目标,不同的是对问题进行剖析的角度和实施的复杂度不同,所以下面的提到的解决方法请读者不要和OP或者OO比出一个谁优谁劣来,就如同米饭和食盐没有任何优劣可比性一样。你看我,又罗嗦了。言归正传, 首先提出问题: 如果某领域的业务规则是过了中午12点就不能登录工作流系统,并且任何用户只要取文档都要被日志记录下来。 从AOP的角度考虑,核心问题方面是:登录和取文档;外围问题方面是:时间约束和日志记录。核心问题是相对稳固的,外围问题是会随着用户需求的变化了变化的。
客户端调用的代码如下:
从调用代码可以发现,除了用 WorkFlowEngineBuilder.BuildObject<WorkflowEngine>() 代替了new WorkflowEngine() 之外没有其它的变化,但运行时可以发现,变量 workEng 其实保存的是 WorkflowEngine的派生类型。这些都是表象,能说明的问题只有一个:这样的AOP实现方式在应用层还是很平滑的,不至于让程序员一开始就觉得接受不了,但这不是主要问题或者说不是主要的矛盾。是什么原因导致了AOP概念浮出水面,让G#或者aspectj取得了生存空间呢? 回头我们再分析WorkFlowEngineBuilder 类的如下代码:
上面的代码是指WorkFlowEngineBuilder 所针对的要注入代码的目标类型,如果把 typeof(WorkflowEngine) 该成别的,WorkFlowEngineBuilder 是不是就成为其它类型的注入者呢?是的。再看:
如果改写这个提供覆写清单的方法中的匹配规则,那么结合 Tagert 的改变,WorkFlowEngineBuilder是不是就完全服务于一个全新的应用场景了?那么我们平时提到的重构、复用、责任链模式等等是不是都可以在AOP的驱动下完成呢?需要提出的是:我的例子只是为了肤浅的说明一下AOP,让不了解的人有一点点了解,代码部分写的比较烂,应该没有什么借鉴之处。download source and demo / for .net 2.0.
posted on 2006-10-26 11:57 头发又乱了 阅读(1689) 评论(4) 编辑 收藏 网摘
Powered by: 博客园 Copyright © 头发又乱了