我现在有个问题
有一个类o,
class o {public void f(){int x=0;
//我想在编译的时候,在这里自动增加上一些语句或是方法调用,(也就是说,在程序运行的时候,动态的织入一些代码)
}}
我在网上看了关于aop方面的东西,但我觉得太墨迹了,你们有什么好的方法来实现我想要的效果吗
谢谢大家了,我想做一个orm框架,但是延时加载这里累死我了,所以我想问问大家有没有好的方法

解决方案 »

  1.   

    aop本来就是磨叽,因为它硬要搞个“万能”方法。如果你自己的系统,你可以高效率地定一个了 public event ..... 就OK了!只不过这是你定义个一个事件,而不是像aop那样偏要发明个不分公母都随地硬插的机制出来。
      

  2.   

    CSharpCodeProvider http://topic.csdn.net/u/20100903/15/bdb0da13-426b-456a-b6ed-15c22dc69c8d.html
      

  3.   


    不懂就不要装好不好,免得误导别人,aop在java领域已经很成熟了,有很成熟的解决方案和成功的案例,怎么就成了磨叽了?
      

  4.   

    关于延时加载,虽然你没有说到什么有趣的问题,不过既然在csdn上很少见到有志气做自己的orm的,我还是给你一个提示。简单那来说,一个延时加载功能接口大致是是这样(我随便手写,不保证语法正确,看得懂就行了):public IActivator
    {
        bool Activated{get;set;}
        event Action Active;
    }然后当你的ORM从数据库中读取数据并创建一个实体实例时,判断此对象是否具有此接口。例如:    if(obj is IActivator)
        {
            obj.Activated=false;
            obj.Active += ()=>
                {
                    obj.Activated=true; 
                    取并设置所有引用自定义class的属性(obj); 
                };
        }
        else
        {
            读取并设置所有引用自定义class的属性(obj);
        }这样,假设我们有“研究项目”对象实例,它有几十个引用其它自定义class的属性我们想延迟加载,那么大致可以这样定义:    public class 研究项目: IActivator
        {
            public event Action Active;
            public bool Activated{get;set;}        private 管理人员 _pm;        public 管理人员 产品负责人
             {
                get
                {
                   if(!Activated)
                      Active();
                   return _pm;
                }
                set
                {
                   _pm=value;
                }
            }
    .......                      
      

  5.   

    不用在java混个概念熟悉,在.net也来混点熟吧!我举一个例子:在.net,2001年.net还没有正式发布1.0而仅仅做预演的时候好像就有remoting等等,你说它是不是给你很好地制造了“随时随地强插”(既不需要代码源作者同意就可以强行插入自己的代码)的机制?那么知道.net有remoting之类的东西吗?知道怎么在项目内强插代码吗?问题是,这些20年、10年、5年的很“成熟”的东西,不是产品主流(我不是说remoting不主流,而是用remoting仅仅为了当作aop时才不是)。
      

  6.   


    说你不懂你还不服,你的例子毫无可比性。aop不会破坏原有的类,原来的类还是原来的行为,只不过在你本次调用上在你的执行逻辑上改变其行为,因此不存在什么“既不需要代码源作者同意就可以强行插入自己的代码”,另外.net remoting不是作为aop工具而设计的,不要混淆概念,他的出现是为了简化rpc编程。真的建议你查查aop的资料。
      

  7.   

    这些20年、10年、5年的很“成熟”的东西,不知道oracle,sql server,java算不算成熟,算不算主流?
      

  8.   

    这个代码我大前年就能写出来,如果象你这样写,得把人累死,
    aop的作用就是减少代码写入的劳动强度,我就想把get和set里面的语句给弄成aop的方式
    你可愁死我了
      

  9.   

    有关延迟加载问题请看下面两篇
    http://www.cnblogs.com/anytao/archive/2009/10/29/must_net_33.html
    http://www.cnblogs.com/JeffreyZhao/archive/2009/08/05/from-delegate-to-others.html在net4里dynamic 和 Lazy<T> 完全可以做到当然在net4以下也不是不可能完成的任务,get,set,配合事件和委托也完全是可能的方案
      

  10.   

    像lz所谓的java的aop完全基于动态代理上,而net,java的动态代理一直就是短板,别看lz所谓java啥aop成熟,嘿嘿,谁用谁知道---动态代理不墨迹,谁墨迹?
      

  11.   

    仔细看了一下楼主的需求,发现实际上你做的事情还是在编译期的事情,那么lz可能走错了方向,你不应该去看啥aop(aop实际是运行期配置,而非编译期配置),lz实际应该看的是文本模板引擎,比如T4模板引擎,vs里自己带的t4引擎,完全可以做到你要的要求
      

  12.   


    工具仅仅是工具而已,必然有它适合的情况和不适合的情况,没有放之四海皆适用的解决方案,怎么用还要看设计者,你非要使用它的短板那也是没有办法,依照你的理论,mysql根本就不能用,因为myisam根本就不支持事务还是表级锁,但是各大网站都在用,而且设计良好者,既能保证事务安全又并发效率高。所以不要去讨论框架工具是否墨迹,是要看你的需求是否需要你墨迹和你的设计是否墨迹。