本文說明如何以 NHibernate 取代 PetShop 4.0 原本的 DAL,建立通用持久層,解決重複 CRUD 程式碼與資料庫移植難題。
專門負責資料持久化的獨立層次,對應「單一職責」原則。PetShop 4.0 DAL 直接寫 SQL、手動映射 DataReader 到 Model,每張表重複 CRUD,支援多資料庫需寫多套 DAL。


public interface IRepository<T> where T : class
{
T Get(object id);
object Save(T entity);
void Update(T entity);
void SaveOrUpdate(T entity);
void Delete(T entity);
IQueryable<T> LoadAll();
}
using Spring.Data.NHibernate.Generic.Support;
using NHibernate.Linq;
public abstract class RepositoryBase<T> : HibernateDaoSupport, IRepository<T> where T : class
{
public virtual object Save(T entity) => HibernateTemplate.Save(entity);
public virtual T Get(object id) => HibernateTemplate.Get<T>(id);
public virtual IQueryable<T> LoadAll() => Session.Linq<T>();
public virtual void Update(T entity) => HibernateTemplate.Update(entity);
public virtual void Delete(T entity) => HibernateTemplate.Delete(entity);
public virtual void SaveOrUpdate(T entity) => HibernateTemplate.SaveOrUpdate(entity);
}