Asp.Net大型項目實踐(4)-用NHibernate儲存和查詢我們的業務領域對象

來源:互聯網
上載者:User

  關於NHibernate的相關資料不是很多,關於它在.Net項目中的實際應用的資料就更少了,在開始用NHibernate的時候也走了不少彎路,到現在自我感覺能在項目中合理應用NHibernate了。這裡要感謝下同事1-2-3,關於NHibernate應用的不少技術細節問題基本都靠他努力解決的。也感謝李永京的NHibernate之旅系列文章導航,在入門初期省去了我閱讀英文文檔的麻煩,感謝了兩位之後貌似NHibernate這塊就沒我啥事了...汗
註:額外說一下 目前.Net下可用使用ORM工具不少,但我個人覺得NHibernate是目前.Net下最強大最好用的ORM工具,這裡我不想挑起.Net ORM架構之爭,如果要爭也希望大家在項目中實際應用之後再說,別老說什麼NHibernate XML配置麻煩,效率低之類的 沒有前提的無聊的話。至少在我的項目裡正因為有了NHibernate才能使我可以比較OO的去建我的業務領域對象,貌似更加接近傳說中的真正的所謂對象關係映射....

  1. 同樣按照國際慣例,我們應該建立一個統一的一般的資料庫提供者代碼

    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.有的同學看到介面設計的這麼簡單估計沒興趣看下去了...別急,咱分頁,排序,多條件組合查詢,多表查詢等等典型應用情境一個不缺 請的慢慢看下去..有圖有真相:

  2. 有了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沒啥事.....

  3. 插一句,下面的內容涉及到較多NHibernate技術細節,建議先去把李永京大哥的NHibernate之旅系列文章導航大概過一遍再來接著看,否則不大容易看懂,不過我盡量寫的詳細一點,至少做到讓大家理解,寫完也會貼上源碼供大家參考 源碼在下一篇下載
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.