none
函式庫間的參考問題 RRS feed

  • 問題

  • 作業系統版本-Windows XP
  • 開發工具版本-Visual Studio 2005
  • 開發環境-Web Form

     

    首先我的方案裡包括了二個ClassLibrary和一個Website,

    ClassLibrary分別為 DataAccessLayer 和 BizLogicLayer,

    而我 DataAccessLayer 裡加入 NHibernate.dll 的參考,隨即參考清單裡就有 NHibernate,

    compiler 後 bin\Debug 目錄下有 DataAccessLayer.dll 和 NHibernate.dll 檔。

    再來 BizLogicLayer 加入參考(即專案名稱為 DataAccessLayer),隨即參考清單只有 DataAccessLayer,

    complier 後 bin\Debug 目錄下卻有 BizLogicLayer.dll、DataAccessLayer.dll 和 NHibernate.dll 檔。

     

    以上是環境描述,問題是 BizLogicLayer 我無法使用 NHibernate 的函式。

    例如: ISession的宣告

    ISession session = DataAccessLayer.NHibernateHelper.GetCurrentSession();

    ISession VS2005 無法使用。

     

    想問各位高手,一個函式庫 (A) 所加入的參考,在另一個函式庫(B) 參考 函式庫(A)後

    (B) 無法使用 (A)原本所加入的參考嗎?

     

    是否我操作有誤,麻煩高手們幫忙。謝謝...

2008年11月14日 上午 01:43

解答

  • HI,

     

    您的操作沒有錯, BizLogicLayer只能用到DataAccessLayer, 而不能直接使用未參考的NHibernate, 如果BizLogicLayer也要使用NHibernate功能, 一種做法是自行加入參考NHibernate組件. 另外一種做法是透過DataAccessLayer提供的功能間接使用NHibernate提供的功能

     

    tihs

    2008年11月14日 上午 03:27

所有回覆

  • 你的那個 NHibernateHelper 是靜態的成員嗎?

    如果不是,則要先 new 出實體才可以用。

     

    2008年11月14日 上午 03:13
    版主
  • HI,

     

    您的操作沒有錯, BizLogicLayer只能用到DataAccessLayer, 而不能直接使用未參考的NHibernate, 如果BizLogicLayer也要使用NHibernate功能, 一種做法是自行加入參考NHibernate組件. 另外一種做法是透過DataAccessLayer提供的功能間接使用NHibernate提供的功能

     

    tihs

    2008年11月14日 上午 03:27
  • NHibernateHelper 是 static 的~~

    謝謝小朱

     

    2008年11月14日 上午 06:46
  • Dear tihs

     

    操作沒錯,那我的想法是為啥BizLogicLayer 參考 DataAccessLayer 了,卻無法用NHibernate組件呢

    難道參考沒有繼承的行為嗎?

    這樣兩個類別函式庫都要自行參考NHibernate組件才能使用,這樣切割成兩個好像就沒意義是嗎?

    也就是只要用一個類別函式庫來做就行了。

    麻煩 tihs 幫我解惑。謝謝 ...

     

     tihs 寫信:

    HI,

     

    您的操作沒有錯, BizLogicLayer只能用到DataAccessLayer, 而不能直接使用未參考的NHibernate, 如果BizLogicLayer也要使用NHibernate功能, 一種做法是自行加入參考NHibernate組件. 另外一種做法是透過DataAccessLayer提供的功能間接使用NHibernate提供的功能

     

    tihs

    2008年11月14日 上午 06:52
  • >>這樣兩個類別函式庫都要自行參考NHibernate組件才能使用,這樣切割成兩個好像就沒意義是嗎?

    >>也就是只要用一個類別函式庫來做就行了。

    >>麻煩 tihs 幫我解惑。謝謝 ...

     

    這是物件導向設計中,組件分割的問題

    既然你必須在程式中兩個Assembly都要使用NHibernate,當然都必須引入.

    你的範例中

    ISession session = DataAccessLayer.NHibernateHelper.GetCurrentSession();

    並不是沒有意義.

     

    DataAccessLayer.NHibernateHelper.GetCurrentSession()的目的是要產生ISession實體,因此為static method很有可能是一個Factory creator.

    若是如此,DataAccessLayer.NHibernateHelper.GetCurrentSession()就可以做到封裝"連線資訊"與產生單一Instance的功能.

    而如果,DataAccessLayer.NHibernateHelper.GetCurrentSession()會用於很多組件之中,那將其獨立出來就有意義.

     

    你會有此疑問其實是出在對於物件導向設計上的不瞭解導致.但這是正常的,這些經驗要慢慢累積.

    2008年11月14日 上午 07:54
  • #這樣兩個類別函式庫都要自行參考NHibernate組件才能使用,這樣切割成兩個好像就沒意義是嗎?

    一個人打遍天下,切幾層當然都無所謂.

    但當你程式越來越大,或多人合作時就差很多.

    當然要切割當然要夠水準,不是隨便切一切.

     

    比如 你有三個Team 去寫企業方案,A.寫企業層(BizLogicLayer).B.WindowForm(企業內部資源),有參考到企業層.C.ASP.NET Page 給 Page(給Pos用)也有參考到企業層.

     

     

    所以,總之..你認為有沒有差!

     

     

     

    2008年11月14日 下午 03:16
  • HI,

     

    1) 專案參考組件和類別的繼承是兩件不同的事情

    2) 專案切模組是為了提升程式的維護性, 不是為了使用到其他模組參考到的組件, 例如NHibernate

     

    tihs

    2008年11月15日 下午 01:32