關於NHibernate的相關資料不是很多,關於它在.Net項目中的實際應用的資料就更少了,在開始用NHibernate的時候也走了不少彎路,到現在自我感覺能在項目中合理應用NHibernate了。這裡要感謝下同事1-2-3,關於NHibernate應用的不少技術細節問題基本都靠他努力解決的。也感謝李永京的NHibernate之旅系列文章導航,在入門初期省去了我閱讀英文文檔的麻煩,感謝了兩位之後貌似NHibernate這塊就沒我啥事了...汗
註:額外說一下 目前.Net下可用使用ORM工具不少,但我個人覺得NHibernate是目前.Net下最強大最好用的ORM工具,這裡我不想挑起.Net ORM架構之爭,如果要爭也希望大家在項目中實際應用之後再說,別老說什麼NHibernate XML配置麻煩,效率低之類的 沒有前提的無聊的話。至少在我的項目裡正因為有了NHibernate才能使我可以比較OO的去建我的業務領域對象,貌似更加接近傳說中的真正的所謂對象關係映射....
- 同樣按照國際慣例,我們應該建立一個統一的一般的資料庫提供者代碼
namespace Demo.HIS.FrameWork.Repository
{
public interface IRepository<T> where T:Entity
{
T Load(string id);
T Get(string id);
IList<T> GetAll();
void SaveOrUpdate(T entity);
void Update(T entity);
void Delete(string id);
void PhysicsDelete(string id);
}
}
a.大家應該通過這些介面方法的名字就應該猜出其中的含義了吧?什麼擷取一個對象,儲存對象,刪除對象,擷取一個List...
b. public interface IRepository<T> where T:Entity 這個寫法的意思表示泛型對象T只允許是繼承於Entity基類的對象,還記得Entity嗎?Asp.Net大型項目實踐(3)-業務領域對象建模這篇裡有講到的,Entity是系統中所有可以被持久到資料庫的業務對象都應該繼承的基類,這樣寫可以避免你傳一些阿貓阿狗的類型給我叫我給你Save,Delete....
c.Load和Get的命名和NHibernate有關 ,以後會講到,心急的同學可以google“Hibernate Get Load 區別”
d.Delete和PhysicsDelete ,上一篇有講到 我們系統中預設刪除為邏輯刪除,所以物理刪除屬於“變態”特別命名
e.有的同學看到介面設計的這麼簡單估計沒興趣看下去了...別急,咱分頁,排序,多條件組合查詢,多表查詢等等典型應用情境一個不缺 請的慢慢看下去..有圖有真相:
- 有了IRepository介面 我們就可以寫針對這個介面的具體是實現了 因為我們是用NHibernate實現所以我們建一個這樣的類代碼
namespace Demo.HIS.FrameWork.Repository.Nhb
{
public class RepositoryNhbImpl<T> : IRepository<T> where T : Entity
{
#region IRepository<T> 成員
public T Load(string id)
{
throw new NotImplementedException();
}
public T Get(string id)
{
throw new NotImplementedException();
}
public IList<T> GetAll()
{
throw new NotImplementedException();
}
public void SaveOrUpdate(T entity)
{
throw new NotImplementedException();
}
public void Update(T entity)
{
throw new NotImplementedException();
}
public void Delete(string id)
{
throw new NotImplementedException();
}
public void PhysicsDelete(string id)
{
throw new NotImplementedException();
}
#endregion
}
}
如果你是想用Linq去實現資料庫的訪問 那你就建立個“public class RepositoryLinqImpl<T> : IRepository<T> where T : Entity ”類,不過要是這樣的話你就沒啥必要繼續看下去了,因為下面的基本和Linq沒啥事.....
- 插一句,下面的內容涉及到較多NHibernate技術細節,建議先去把李永京大哥的NHibernate之旅系列文章導航大概過一遍再來接著看,否則不大容易看懂,不過我盡量寫的詳細一點,至少做到讓大家理解,寫完也會貼上源碼供大家參考 源碼在下一篇下載