MicroHelper.Net

雷锋说.对待朋友要MicroHelper,对待敌人要害尔扑
随笔 - 74, 评论 - 431, 引用 - 7

导航

工具

关于

邮件系统不稳定,使用songdming at 263 dot net吧
PageRank

FastCounter by bCentral

 

标签

每月存档

广告



访客

 

前两天一直昏昏沉沉,提不起精神,今天才有点起色

今天仔细看jgtm2004给我发的link
我对AOP不了解,对模式也不是很熟悉,两周后空下来了,仔细去学习学习

我想到一种方法,不过我没有验证过可不可行,只是突然想到而已

如下。

基本原理:

现在Runtime越来越流行,是不是可以搭建一个Runtime,我们通过这Runtime来调用某些类?

首先声明一个 delegate
delegate RTMCallFunctionEventHandler;

在RTM类里面定义俩个事件,

public class RTM
{
   public event RTMCallFunctionEventHandler Calling;
   public event RTMCallFunctionEventHandler Called;

   public void Call(Type functionName, Paremeters paremeters)
   {
     if (Calling;!= null)
     Calling;(sender,e);

    调用
  
     if (Called;!= null)
     Called;(sender,e);
   }
}

在其他类中订阅者这两个事件,进行处理。

调用某个类的方法时要通过RTM

public class Calculator
{
 public int Add(int x, int y) { return x + y; }
}

public class myClass
{
 public void CallAdd()
   {
     int result;
  
    result = RTM.Call(functionName := Calculator.Add; paremeters := paremeters(1,2)); 
   }
}

相关文章

打印 | 张贴于 2004-02-05 10:30:00 | Tag:Dot Net

留言反馈

#online pharmacy 编辑
I like work: it fascinates me. I can sit and look at it for hours.
2007-03-29 12:13:00 | [匿名用户:online pharmacy]
#diabetes 编辑
The most important thing she'd learned over the years was that there was no way to be a perfect mother and a million ways to be a good one.
2007-03-29 03:51:00 | [匿名用户:diabetes]
#paxil pneumogastric diddle 编辑
It is better to offer no excuse than a bad one.
2007-03-29 00:47:00 | [匿名用户:paxil pneumogastric diddle]
#drug 编辑
You don't get anything clean without getting something else dirty.
2007-03-28 21:06:00 | [匿名用户:drug]
#vitamin 编辑
My home is not a place, it is people.
2007-03-26 20:14:00 | [匿名用户:vitamin]
#prescription drug 编辑
Happiness is not a station you arrive at, but a manner of traveling.
2007-03-26 12:48:00 | [匿名用户:prescription drug]
#hydrocodone 编辑
Whatever you fear most has no power - it is your fear that has the power.
2007-03-24 02:12:00 | [匿名用户:hydrocodone]
#adipex 编辑
A synonym is a word you use when you can't spell the word you first thought of.
2007-03-23 10:07:00 | [匿名用户:adipex]
#cheap viagra handpick mating 编辑
Listen. Do not have an opinion while you listen because frankly, your opinion doesn?t hold much water outside of Your Universe. Just listen. Listen until their brain has been twisted like a dripping towel and what they have to say is all over the floor.
2007-03-23 05:55:00 | [匿名用户:cheap viagra handpick mating]
#vicodin 编辑
Good company and good discourse are the very sinews of virtue.
2007-03-22 21:37:00 | [匿名用户:vicodin]
#weight loss 编辑
We have too many high sounding words, and too few actions that correspond with them.
2007-03-22 14:27:00 | [匿名用户:weight loss]
#valium 编辑
Do something every day that you don't want to do; this is the golden rule for acquiring the habit of doing your duty without pain.
2007-03-22 11:00:00 | [匿名用户:valium]
#lipitor 编辑
Feet, why do I need them if I have wings to fly?
2007-03-22 06:49:00 | [匿名用户:lipitor]
#lipitor 编辑
Feet, why do I need them if I have wings to fly?
2007-03-22 06:49:00 | [匿名用户:lipitor]
#levitra 编辑
Life is pleasant. Death is peaceful. It's the transition that's troublesome.
2007-03-22 03:05:00 | [匿名用户:levitra]
#levitra 编辑
Joy is prayer - Joy is strength - Joy is love - Joy is a net of love by which you can catch souls.
2007-03-21 23:46:00 | [匿名用户:levitra]
#levitra 编辑
Joy is prayer - Joy is strength - Joy is love - Joy is a net of love by which you can catch souls.
2007-03-21 23:46:00 | [匿名用户:levitra]
#tramadol online 编辑
Humor is also a way of saying something serious.
2007-03-21 20:09:00 | [匿名用户:tramadol online]
#phentermine online 编辑
So act that your principle of action might safely be made a law for the whole world.
2007-03-21 12:04:00 | [匿名用户:phentermine online]
#health 编辑
My theology, briefly, is that the universe was dictated but not signed.
2007-03-21 00:39:00 | [匿名用户:health]
#fitness equipment 编辑
The secret of greatness is simple: do better work than any other man in your field - and keep on doing it.
2007-03-20 16:34:00 | [匿名用户:fitness equipment]
#adipex 编辑
In America, they want you to accomplish these great feats, to pull off these David Copperfield-type stunts. You want me to be great, but you don't ever want me to say I'm great?
2007-03-16 09:00:00 | [匿名用户:adipex]
#purchase phentermine 编辑
You can't have a light without a dark to stick it in.
2007-03-12 01:18:00 | [匿名用户:purchase phentermine]
#phentermine adipex 编辑
As soon as you trust yourself, you will know how to live.
2007-03-09 12:11:00 | [匿名用户:phentermine adipex]
#phentermine adipex 编辑
As soon as you trust yourself, you will know how to live.
2007-03-09 12:10:00 | [匿名用户:phentermine adipex]
#回复: 自定义一个RTM 编辑
@kaneboy:

按你这个要求的话,看来这个周末还是写不不来啊——还要老少皆宜……看来我得先做个读者调查啦!:)

@iamcrc:

开眼界!谢谢你给我们的信息!有精力我会好好研究一下的。总的来说,AOP在.NET中的情况也是差不多,也是主要就这么几种机制。而我目前主要关注的是在不利用第三方产品的前提下仅利用.NET/CLR的机制来实现基本的也是最有意义的AOP编程——当然我也想揭示一些尚存的问题,更希望微软能够重视AOP对于.NET世界的重要意义。

@jjx:

的确,MTS应该说是实现AOP概念的第一个实例了!这还是得益于COM世界基于纯抽象接口的设计——正如文章第一部分所说,这是应用DECORATOR模式的重要基础。而对于Java社区而言,当年它高举OOP大旗,现在看来又要引领AOP了。不过也好,.NET正好可以在它演变的过程中取其精华、去其糟粕——等到Aspect.NET出现的时候,相信该是AOP进入成熟阶段的标志了。

总之,关注技术的发展,更要关注技术发展能给我们带来的实际好处。而我写文章的目的,就是希望更多的人能够了解这些好处并将其运用起来,并从中获取更大的价值。:)
2004-02-05 19:08:00 | [匿名用户:JGTM'2004 [MVP]]
#回复: 自定义一个RTM 编辑
在.net社区中,对于aop的理解很简单,你可以将mts(com+),.net 的attribute 看作是aop 的一些实现
2004-02-05 18:28:00 | [匿名用户:jjx]
#回复: 自定义一个RTM 编辑
我也来胡说两句:
在java世界中的AOP framework我知道的有四个:
AspectJ、AspectWerkz、nanning、JBoss AOP,其中
AspectJ正如JGTM大侠说说,利用编译期代码缝合。
AspectWerkz利用了class loader(bootstrap class loader除外)在加载类时,从配置文件中读取必要的信息,修改类的行为(称为weave);
nanning是基于java.lang.reflect.Proxy 的思路实现的,利用动态代理把调用切换到事先定义好的Interceptor中。
而JBoss AOP还可以支持元数据,元数据能够起到C#中属性类似的功能(很有意思吧:))。而JBoss AOP的元数据支持是通过xDoclet来实现。

可以看出,Java中的AOP,目前也分为运行时动态加载、静态缝合和加载虚拟机时动态加载 三个方向。

其实jdk下一版本的,好像一直有在考虑参考C#中面向属性开发的技术。

ps:以上言论引诉了不少我的好友axing给我的讲解:)
2004-02-05 17:35:00 | [匿名用户:iamcrc]
#回复: 自定义一个RTM 编辑
JGTM'2004:

你说的利用.Net Remoting方法实现偶也隐约猜出了个大概。

CLR本身为了实现远程调用,利用了Proxy模式,在本地创建了一个proxy对象,这个proxy对象在调用远程的realproxy对象执行方法时,会在前面后面插入自己的操作...

前阵子看过在Java中利用proxy模式实现远程调用的一篇东西,正好还有些印象,Java中好像是通过让proxy对象继承一个SessionHandler接口,Java Runtime在这个接口上做了一些手脚,于是proxy对象可以在调用realproxy对象前后做些事情。

快快把后篇写完了发出来,申明偶对COM、ATL不熟悉的说,所以拜托尽量写得深入浅出、通俗易懂、老少皆宜...
2004-02-05 16:22:00 | [匿名用户:kaneboy]
#回复: 自定义一个RTM 编辑
@microhelper:

你说的这个功能CLR已经有了(实际上CLR就是为这个目的设计的,这部分架构即所谓的.NET Remoting Infrastructure)。比如下面的代码:

MyObject o = new MyObject();
o.Call();

如果MyObject是一个配置好的远程对象的话,那么CLR必须要拦截o.Call()方法调用并将其转发到远程服务器上。我所提到的实现AOP的方法也是基于这个技术,只不过最终调用还是转发到本地对象——但是中间已经经过了我们设置的处理不同aspect的代码。因此说,你想做的这么一个runtime(看到RTM总让我以为是released-to-manufactory:)似乎意义不大(虽然你不改变server的代码,但是client的代码会被搞乱)。

看来以后我写文章还是应该一气呵成,不能只说半拉,不然太容易引起误解咯。:)
2004-02-05 15:43:00 | [匿名用户:JGTM'2004 [MVP]]
#回复: 自定义一个RTM 编辑
编程技术的发展我想大概是这样的:人们在设计过程中发现一些很难处理或者对某些地方期望有更好地实现,比如jgtm提到的oop在这一领域的欠缺,于是人们会提出一些改进的想法,比如aop,然后在目前的语言上试图实现这些思想,因为语言的各自特性的差异,实现起来有差异有优劣这是正常的,当这些思想成熟到一定程度,程序语言就会进化来,引入新的特性以使这些思想实现起来更简单。

所以progame说jgtm的aop比起java下的aop差得太多了,这是仁者见仁,智者见智,况且用不同的语言来实现本来就有差异,我们应该将焦点集中于差异在那里,怎么改进设计,还有什么其他的方式,不同方式的优劣分析等等

对于语言一些具体特性的争论,没有必要下定论说好还是不好,语言是死的,对我们应用的人来说重要的是如何灵活运用,趋利避害。

@JGTM'2004
我所说的RTM不是指CLR那样的,大概是一个framework,他会对方法的调用加以解析,在不改变原有server代码的基础上,添加新的功能.


2004-02-05 14:48:00 | [匿名用户:microhelper]
#回复: 自定义一个RTM 编辑
@progame:

是不是就Java下面的AOP才是真正的AOP?听你这么评价问题,不知道的人以为AOP是由老大你定义的呢!AspectJ是很酷,我也很欣赏它的创意和机制,但这并不意味着它就是完美的AOP——这是由它的实现原理所决定的(编译期代码缝合)。

同理,我也不能说目前.NET/CLR提供的各种机制就能够实现所谓真正的AOP(我一直认为“真正的”或说理想中的AOP还是可能要靠新的语言特性和编译器支持才能够实现,就像C++的template或者C#中的generic一样,包括AspectJ——它不是也有自己的编译器吗)——其实真不真正又有什么意义呢?我们需要的是利用技术解决问题,而不是找个话茬儿做些无聊的评论!

如果老兄有好的见地,不妨指教一二:什么才算是真正的AOP?需要那些机制才能够实现真正的AOP?在.NET中如何借助AOP的思想和CLR的机制解决一些OOP不能很好解决的问题?

另外关于动态属性,我不得不再跟你叫板:我知道你说的实际上是custom attribute。这东西可不是动态的,它是静态的,所以适用于相对代码而言是静态的那些特征描述场合——如线程相依性、唯一标识等等。这些东西不需要也不允许在代码之外和运行期间动态改变,因此静态的自定义属性是再合适不过的了。反之,如果你需要动态性,那么可以使用外部配置信息来改变程序的运行行为(如ORM中的mapping schema)。然而,两者结合起来更是相得益彰啊!我可以使用静态的custom attribute静态的描述代码的默认行为,同时引入外部配置信息允许override一些需要灵活性的动态配置信息……无论是custom attribute还是外部配置文件也好,无非是为程序提供一些环境参数信息从而产生不同的执行逻辑而已,没什么本质不同(就好比一些存在光盘上的数据和一些存在硬盘上的数据一样:数据可死可活,程序(员)更是如此!!)。这么好的开发特性你却总是嗤之以鼻,有一说一,我真觉得你已经有些“审美疲劳”喽……

所以这里拜托你在探讨问题的时候把相关概念、原理、应用场合等等都搞清楚,不要总是断章取义或是片面的评论问题。我们讨论的问题都是牵扯到很多方面的,不是一个概念就可以为其定性的。所以,如果你只用这些无关痛痒的东西为一件事物定性,只能说明你的知识面还太单薄了——我真的很奇怪,为什么你总是跟custom attribute过不去,这东西和我们讨论的话题有直接关系吗?它不就是一些与代码绑定的静态元数据吗?你干吗老是大惊小怪的用它混淆视听?能不能把注意力放到问题本身提出你的见解?——最后一次就“动态属性”给你摆事实讲道理了噢!谢谢你虚心接受我的意见!:)
2004-02-05 13:37:00 | [匿名用户:JGTM'2004 [MVP]]
#回复: 自定义一个RTM 编辑
我早先看jgtm那篇文章时就觉得可能是使用动态属性来实现.net的aop
如com+的transcation和nunit的test

但这样的aop比起java下的aop差得太多了
因为我还是那样的理解
动态属性依然是类的一部分
这也是我当初为什么反对使用属性做为o/r mapper

所以这样的aop也不是真正的aop
2004-02-05 12:43:00 | [匿名用户:progame]
#回复: 自定义一个RTM 编辑
不过还是要说,你的思路是很正确的!AOP的关键是将一些共用功能代码(调用日志、性能技术等等)与其所服务的对象类型分开,从而可以在不同的对象类型上重复应用——这一点是用传统OOP无法完美解决的。

本文的最终目的是给大家一个新的思路来解决文章中引出的问题,也就是说利用CLR自身提供的机制为已有对象扩充功能,而不会搞乱客户代码和对象代码(不过还是需要改变和添加一些声明)。比如已有的代码如下:

客户代码:

ICalculator calculator = new Calculator();
Console.WriteLine(calculator.Add(3, 5));

对象代码:

public class Calculator: ICalculator
{
public int Add(int x, int y) { return x+y; }
}

如果我需要在执行的时候能够得到客户代码对Calculator方法的调用日志,我只需要给Calculator添加[Logging]属性即可——对象已有的方法实现不受任何影响、调用代码也不受任何影响——这正是AOP技术的目的。

如果有人以前实践过类似的机制,也希望你能把一些想法与大家分享一下。:)
2004-02-05 11:32:00 | [匿名用户:JGTM'2004 [MVP]]
#回复: 自定义一个RTM 编辑
我们不是已经在一个很棒的Runtime中开发了吗?这个runtime正是CLR!我写这篇文章就是希望更多的人能够了解CLR的能量,从而更好的利用它的能量——从而不用重新发明轮子。:)

在文章下篇完成之前,感兴趣的朋友们可以顺着文章第一部分结尾处的提示先对CLR中的相关机制作些了解。第二篇中会有一些新东西与大家分享——第一篇主要是引出问题,而不是完美的解决问题(虽然很多朋友给我写信说学到很多东西,可我要写得其实还没写出来呢……:)
2004-02-05 11:15:00 | [匿名用户:JGTM'2004 [MVP]]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode MVC Blogger System