现在关于DotNet方面的开源框架渐渐多了起来,大都是Java的版本转换,看来java在设计思想和成熟框架方面沉淀不少。
当前可用的不多:Ioc 方面的PicoContainer/NanoContainer ,数据持久方面的 NHibernate (Dev的Xop是要美刀的)。其他大都还是alpha中,比如大家关心的SpringNet,计划是先实现Ioc和Aop,但仍迟迟不能release。
即使是已经发布的PicoContainer for .net ,给人的感觉也象是二奶生的孩子,相关文档只有几个初始入门级的,寥寥数语,点到皮毛为止。更新列表倒是比较频繁,可惜全是for java版本的。看来近阶段,只能是跟在java屁股后追了。
不管怎样,还是先下载下来,实际是检验真理的唯一标准。Martin Fowler在他的文章(http://martinfowler.com/articles/injection.html)里已经很好的阐述了Ioc(他认为叫Dependency Injection更为贴切)框架的理论,并且比较了实现轻量级Ioc的几个方法的利弊取舍。千句万话归结为一句“将组件的配置与使用
分离,并且是由框架完成的”,确实诱人。
于是按着例子,照猫画虎,写两个类,类A引用类B,但类A没有实例类B的代码,只是在构造函数中有一个类B的引用参数。再向框架注册这两个类
IMutablePicoContainer pico = new DefaultPicoContainer();
pico.RegisterComponentImplementation(typeof(B));
pico.RegisterComponentImplementation(typeof(A));
下面是使用类A了
A a = (A) pico.getComponentInstance(typeof(A));
a.anyProduce();//调用a的某个方法。
上述代码中没有类B的实例化代码,但类B确实实例化了。神奇。
按F11跟踪,弯弯绕绕,终于发现constructor.Invoke(parameters);这句代码。可以简单描述个流程
1、注册类类型-》保存该类的类信息到一个HashTable内
2、取得一个类的实例时:
根据类信息-》取得类的构造函数列表,根据传入参数,选择一个构造函数,利用反射构造
类的实例。如果一个参数是一个类引用,再反复此过程。嗯,和表达式的堆栈解析算法一
样。
看来使用方面是很快就能入手,甚至在项目进行中,就可以直接插入使用该框架了。
但还有很多问题,在哪个个Layer使用?和NHibernate如何结合?使用它对我们项目中类的设计有何要求?用了它就直接能使我们的项目实现组件化装配吗?
12点了,明天继续研究。