手把手教你写ORM(五)

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

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

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

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


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

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

原文出处:http://www.cnblogs.com/Alexander-Lee/
金鳞岂是池中物,一遇风云便化龙