< daofactory > < dao interface = " gspring.dao.interfaces.iaccountdao, gspring.dao " implementation = " gspring.dao.implementations.accountdao, gspring.dao " /> </ daofactory >
在代码中首先需要进行初始化: domdaomanagerbuilder builder = new domdaomanagerbuilder(); builder.configure( " dao.config " );
这段代码实际上做了很多事情,其中就有:将所有的配置的dao的接口和实现注册到daomanager类的静态属性中去。也就是在整个应用程序或网站启动时注册一次就可以了,以后直接从静态属性中取出来使用就可以了。 和dao注册相关的代码如下: dao.implementation = nodeutils.getstringattribute(prop, " implementation " ); dao.interface = nodeutils.getstringattribute(prop, " interface " ); _daoinstance = _daoimplementation.getconstructor(type.emptytypes).invoke( null ) as idao; _proxy = daoproxy.newinstance( this );
也就是把配置文件中的interface和implementation读取,然后生成代理。 最主要的就是最后一句代码,daoproxy.newinstance的实现如下: castle.dynamicproxy.proxygenerator proxygenerator = new proxygenerator(); iinterceptor handler = new daoproxy(dao); type[] interfaces = {dao.daointerface, typeof(idao)} ; return (proxygenerator.createproxy(interfaces, handler, dao.daoinstance) as idao);
这里我们看到其中使用了castle.dynamicproxy中的方法( 是另外一个开源框架,我和在以后的博客中再说) daoproxy实现iinterceptor接口,也就是aop中常有的拦截机。以后当我们通过idao接口调用实际的dao时,都会先通过daoproxy,由daoproxy拦截后进行一些必要的处理,然后再动态决定调用哪一个dao来进行数据库操作 生成好之后都会放在daomanager的静态属性中,下次要用的时候直接从里面去就可以了: public idao this [type daointerface] { get { dao dao = _daomap[daointerface] as dao; if (dao == null) { throw new dataexception("there is no dao implementation found for " + daointerface.name + " in this context."); } idao idao = dao.proxy; return idao; } }
以上涉及到的主要的类图如下: 原文地址: