Welcome

首页 / 软件开发 / .NET编程技术 / 浅析如何在ObjectBuilder2中用动态方法进行构造器注入

浅析如何在ObjectBuilder2中用动态方法进行构造器注入2011-04-15 博客园 Leo Zhang一、前言

在我看来,OB2是一个用来构建和管理对象的开放性的框架,我们可以根据自己的需求去 扩展它,例如扩展它可以实现依赖注入(如MS的Unity)。我认为OB2最大的亮点之一是在提供 了对象创建框架的同时能够管理对象以及对象之间的依赖关系,控制对象构建和销毁过程, 这样对象的创建就不是直接去使用new而对象的销毁也不仅仅只靠GC了。要说OB2所使用的设 计模式,我觉得可以认为是大量使用策略(Strategy)模式并辅以责任链模式,通过责任链组 织对象创建或销毁的次序及步骤。

二、关键组成部分

1、Locator

利用一个Dictionary对创建的对象建立<键,值>对,之后通过key可以找到相应的 对象,需要注意的是,这里的值是通过System.WeakReference包装过的短弱引用对象,之所 以这样做是想在出现内存压力或其他情况时允许Locator中的对象被GC回收,而强调使用短弱 引用是保证出现内存压力时,对象最晚会在进行第一次finalize后被回收,注意GC和 finalize使用两个不同的工作线程,GC线程被调用会触发finalize线程开始工作,但GC线程 完成收集工作并不意味着finalize线程工作结束,这就意味着对象在GC线程开始工作到 finalize线程释放目标对象之前,目标对象都可以被激活,而这里不用强弱引用恐怕是因为 强弱引用对象会在第一次finalize和第二次finalize之间仍然存在,如果这时候目标对象被 激活可能导致对象状态错误(因为也许对象中某些部分已经被回收)。

2、LifetimeContainer

以一个只读的List<Object>结构存储对象,管理对象的生命周期。不管是值类型还 是引用类型,都可以被加入到容器中,不管是同一个类型的同一个对象还是同一个类型的不 同对象都可以被同时加入容器,可以对容器中所有实现IDisposable接口的对象进行统一的释 放。

3、Strategy与Policy

Strategy,是对算法的封装,OB2中大量使用了策略模式,我们可以将对象的创建、销毁 过程抽象成算法,利用Strategy进行封装从而实现复用和倒置通用算法与具体实现之间的依 赖关系。

Policy,通过传递某些信息辅助Strategy,所谓传递的信息是多种多样的,只要Strategy 需要就可以通过Policy传入,因此有相当大的灵活性,当然Strategy也可以不使用Policy, 这就意味着该Strategy不需要通过外部传递给它信息就能实现算法。

Strategy与Policy相辅相成,为我们创建对象提供了很大的灵活度。

4、BuilderContext

构建上下文,我们的Strategy是以流水线的方式执行的,那么对上下文环境进行封装,为 其提供一个统一的状态存储和共享的环境是有必要的,这样每个Strategy所针对的上下文环 境是确定的,可以清晰的看到这些变化,也就可以随时截取这些变化,我们总是习惯将变化 的东西封装起来,当然不同的上下文之间又可以起到相互隔离的作用,避免有意或无意的干 扰,让对象只知道它应该知道的信息。最后,在构建上下文中存储了最终生成的对象。

三、利用动态方法进行构造器注入

1、基本思路

确定待构建类型TypeToBuild;

为TypeToBuild建立一个动态方法(Dynamic Method),该动态方法的方法体的构建利用反 射发出(Reflection Emit)实现(使用MSIL),大致过程是:找到TypeToBuild的构造函数(优先 查找打了构造器注入标志的构造函数),利用特定Strategy+Policy对其参数进行解析并将解 析结果压入Evaluation Stack,最后调用相应指令生成对象;