手把手教你写ORM(五)

CMMI是魔鬼

继续上面的内容,这里我们要实现一个插件的结构来动态从外部载入数据组件,其好处不用我再多说了,可能有人会发问,插件是AOP的拿手好戏你咋个不用?真是晕死,就2行代码,犯得着引入那么大一堆东西进来么?

插件,首先要定义接口,当然通过Refrection我们无所不能,但是有一个定义好的Interface对性能的改善来说不是一点半点的。
我们引入一个新的项目来定义接口,理由呢就是消除循环引用。
接口的定义:
 1 None.gif namespace  Alexander.Xbase.Interface
 2 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 3InBlock.gif    public interface IQueriable
 4ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
 5InBlock.gif        void Init(string connstr,string configbase);
 6InBlock.gif        void OpenTranscation();
 7InBlock.gif        void Commit();
 8InBlock.gif        void RollBack();
 9InBlock.gif        object Query4Object(string action,object target);
10InBlock.gif        void Query4List(string action,ref IList target,object queryparam);
11InBlock.gif        int Query4Page(string action,ref IList target, object queryparam, int pageid, int pagesize, string sort, string direct);
12InBlock.gif        int Query4Update(string action, object target);
13InBlock.gif        object Query4Count(string action, object target);
14InBlock.gif        void Close();
15ExpandedSubBlockEnd.gif    }

16ExpandedBlockEnd.gif}

这里你也可以按照自己的想法来定义,比如需要更细粒度的操作方法等等,反正我是觉得这几个够用了,连事务都有了,夫复何求阿......

后头的事情就很简单了
我们在主项目里添加一个Factory的类用来获取插件的实例:
 1 None.gif namespace  Alexander.Xbase
 2 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 3InBlock.gif    public class QueryLoader
 4ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
 5InBlock.gif        public static IQueriable LoadQuerySession(string SessionName)
 6ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
 7InBlock.gif            Sessions Session = new Sessions();
 8InBlock.gif            SessionParameter sp = Session.GetSessionByName(SessionName);
 9InBlock.gif            string path = sp.Assambly + ".dll";
10InBlock.gif            Assembly ass = Assembly.LoadFrom(path);
11InBlock.gif            IQueriable query = (IQueriable)ass.CreateInstance(sp.Provider);// (sp.Provider);
12InBlock.gif            query.Init(sp.Connectionstring,sp.Configbase);
13InBlock.gif            return query;
14ExpandedSubBlockEnd.gif        }

15ExpandedSubBlockEnd.gif    }

16ExpandedBlockEnd.gif}


有这么简单么?事情就是这么简单,关键就这两行
 Assembly ass = Assembly.LoadFrom(path);
 IQueriable query = (IQueriable)ass.CreateInstance(sp.Provider);

好了,现在你可以通过修改前一篇提到的数据库配置文件来更换使用的数据库操作组件了。

下一篇我们来看如何对类来做映射。

to be continue.....
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值