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);
}
}