iBatis.NET详解之ServiceConfig类

       iBatis.NET是我接触Nhibernate之后的第二个ORM框架,我觉得这个框架具有小巧玲珑的特点。如果你想自己开发一个ORM框架的话,我觉得iBatis.net肯定是你必须要熟读的,因为它很简洁。如果你深入了解它,你会觉得这种ORM框架的出现是必然的,因为它很接近人们在探索ORM框架的最基本想法。

       我们在自学iBatis.net的时候,都会参考NPetShop这个经典的开源代码。里面有一个核心的类ServiceConfig,理解这个类对理解iBatis.net的核心是非常重要的。下面我给出ServiceConfig的代码,并对其中的重要代码进行注释。

 

 

   /// <summary>
    /// iBatis.NET的核心类 ServiceConfig.
    /// </summary>
    public class ServiceConfig
    {
        static private object synRoot = new object();    //建立一个object对象,在處理多線程的同步時非常有用
        //3:定义一个变量instance来存储创建好的类实例,因为这个变量要在静态方法中使用,所以需要加上static修饰
        static private ServiceConfig instance;     
        private DaoManager daoManager = null;   //定义一个DaoManager类型的daoManager字段

        ///<summary>
        ///1:私有化构造方法,好在内部控制创建实例的数目
        ///</summary>
        private ServiceConfig() { }

        //2:定义一个方法来为客户端提供类实例,这个方法需要定义成类方法(即静态方法),也就是要加上static
        static public ServiceConfig GetInstance()
        {
            if (instance == null)
            {
                //在多线程的程序中,多个线程同时访问单例类,调用GetInstance()方法,会有可能造成创建多个实例在这种情况下,给进行加一把锁来处理
                //lock是确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定代码,则它将一直等,直到对象被释放。
                lock (synRoot)
                {
                    //判断存储实例的变量是否有值
                    if (instance == null)
                    {
                        try
                        {
                            //定义ConfigureHander事件的一个实例handler,并调用Service.Reset作为参数,该事件的作用是
                            ConfigureHandler handler = new ConfigureHandler(ServiceConfig.Reset);  
                            DomDaoManagerBuilder builder = new DomDaoManagerBuilder();
                            builder.ConfigureAndWatch("dao.config", handler);
                            instance = new ServiceConfig();   //如果Instance为空,就创建一个类实例,并把值赋给存储类实例的变量instance. 
                            //返回一个DaoManager实例,"SqlMapDao"为dao.config文件 context 节点id的值
                            instance.daoManager = (DaoManager)DaoManager.GetInstance("SqlMapDao");  
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine(e.Message);
                        }
                    }
                }
            }
            return instance;  //如果Instance不为空,那就直接使用。
        }

        ///<summary>
        ///Reset the singleton
        ///<summary>
        ///<remarks>
        ///Must verity ConfigureHandler signature.
        ///</remarks>
        ///<param name="obj">
        ///</param>
        static public void Reset(object obj)
        {
            instance = null;
        }
      

        //定义一个属性DaoManager,它返回一个DaoManager类的一个实例
        public DaoManager DaoManager
        {
            get
            {
                return daoManager;
            }
        }
    }

 

现在让我们看看ServiceConfig类的具体作用。下面定义一个服务类NewsService,我们通过 IbatisNet.ServiceConfig.GetInstance().DaoManager返回一个DaoManager的一个实例。再通过这个实例进行对数据库的操作。

   public class NewsService
    {
        #region Private Fields
        private INewsDao newsDao;
        private static NewsService instance = new NewsService();
        private DaoManager daoManager = null;

        #endregion

        public static NewsService GetInstance()
        {
            return instance;
        }

        public NewsService()
        {
            daoManager = IbatisNet.ServiceConfig.GetInstance().DaoManager;
            newsDao = daoManager.GetDao(typeof(INewsDao)) as INewsDao;
        }

        public object InsertNews(Domain.News news)
        {
            return this.newsDao.InsertNews(news);
        }

        public Domain.News GetNewsById(float? newsId)
        {
            return this.newsDao.GetNewsById(newsId);
        }

        public IList<Domain.News> GetNewsList()
        {
            return this.newsDao.GetNewsList();
        }

        public IList<Domain.News> GetNewsListByParameter(Parameter.NewsParameter newsParameter)
        {
            return this.newsDao.GetNewsListByParameter(newsParameter);
        }

        public IList<Domain.News> GetNewsListByAnyWhere(string strQueryString)
        {
            Parameter.NewsParameter newsParameter = new Parameter.NewsParameter();
            newsParameter.UnlimitedQuery = strQueryString;
            return this.newsDao.GetNewsListByAnyWhere(newsParameter);
        }

        public int UpdateNews(Domain.News news)
        {
            return this.newsDao.UpdateNews(news);
        }

        public int UpdateNewsByParameter(Parameter.NewsParameter newsParameter)
        {
            return this.newsDao.UpdateNewsByParameter(newsParameter);
        }

        public object DeleteNews(Domain.News news)
        {
            return this.newsDao.DeleteNews(news);
        }

        public object DeleteNewsById(float? newsId)
        {
            return this.newsDao.DeleteNewsById(newsId);
        }

        public object DeleteNewsByParameter(Parameter.NewsParameter newsParameter)
        {
            return this.newsDao.DeleteNewsByParameter(newsParameter);
        }

        public object DeleteNewsByAnyWhere(Parameter.NewsParameter newsParameter)
        {
            return this.newsDao.DeleteNewsByAnyWhere(newsParameter);
        }
    }

 

你可能感兴趣的:(框架,exception,orm,object,null,存储)