程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 通過實際例子感受使用類聚合的便利

通過實際例子感受使用類聚合的便利

編輯:關於.NET

假設有下面兩個表:卡表和卡類型表

Table Card

字段名 字段類型 備注 CardID Number 卡主鍵ID CardKindID Number 卡類型ID StartNO Varchar2(12) 起始號碼 EndNO Varchar2(12) 終止碼號

Table CardKind

字段名 字段類型 備注 CardKindID Number 卡類型主鍵ID CardKindName Varchar2(10) 卡類型名稱 IsValid Char(1) 是否可用

我這個人比較懶,實體之類的東西,都喜歡用代碼生成器生成。

下面是生成的代碼片段

Card表

01 public class Card
02 {
03     #region 私有變量
04       /// <summary>
05     /// 卡主鍵Id
06     /// </summary>
07      private decimal m_CardID;
08     /// <summary>
09     ///  卡類型Id
10     /// </summary>
11     private decimal  m_CardKindID;
12     /// <summary>
13     /// 起始號碼
14       /// </summary>
15     private string m_StartNO;
16     ///  <summary>
17     /// 終止碼號
18      /// </summary>
19      private string m_EndNO;
20     #endregion
21     #region 屬性
22      /// <summary>
23     /// 卡主鍵Id
24     ///  </summary>
25     public decimal CardId
26     {
27          get { return m_CardID; }
28         set { m_CardID = value; }
29      }
30     /// <summary>
31     /// 卡類型Id
32      /// </summary>
33     public decimal CardKindId
34     {
35          get { return m_CardKindID; }
36         set { m_CardKindID  = value; }
37     }
38     /// <summary>
39     /// 起始號 碼
40      /// </summary>
41     public string StartNO
42      {
43         get { return m_StartNO; }
44         set {  m_StartNO = value; }
45     }
46     /// <summary>
47      /// 終止碼號
48      /// </summary>
49     public string  EndNO
50     {
51         get { return m_EndNO; }
52          set { m_EndNO = value; }
53     }
54     #endregion
55      #region 克隆方法 
56      /// <summary>
57     /// 克隆 
58       /// </summary>
59     /// <returns></returns>
60      public new Card Clone()
61     {
62         Card card =  base.Clone() as Card;
63         return card;
64     }
65      #endregion
66 } 

CardKind表

01 public class CardKind
02 {
03     #region 私有變量
04      /// <summary>
05     /// 卡類型主鍵Id
06     ///  </summary>
07     private decimal m_CardKindID;
08     ///  <summary>
09     /// 卡類型名稱
10     /// </summary>
11      private string m_CardKindName;
12     /// <summary>
13      /// 是否可用
14     /// </summary>
15     private bool  m_IsValid;
16     #endregion
17     #region 屬性
18     ///  <summary>
19     /// 卡類型主鍵Id
20     /// </summary>
21      public decimal CardKindId
22     {
23         get { return  m_CardKindID; }
24         set { m_CardKindID = value; }
25      }
26     /// <summary>
27     /// 卡類型名稱
28     ///  </summary>
29     public string CardKindName
30     {
31          get { return m_CardKindName; }
32         set { m_CardKindName  = value; }
33     }
34     /// <summary>
35     /// 是否可 用
36     /// </summary>
37     public bool IsValid
38      {
39         get { return m_IsValid; }
40         set {  m_IsValid = value; }
41     }
42     #endregion
43     #region  克隆方法 
44     /// <summary>
45     /// 克隆
46     ///  </summary>
47     /// <returns></returns>
48     public  new CardKind Clone()
49     {
50         CardKind cardKind =  base.Clone() as CardKind;
51         return cardKind;
52     }
53      #endregion
54 }

接下來,我們將數據查詢出來,並保存到數據列表,數據列表的字段如下

ID 起始號 終止號 卡類型

相信這樣的需求,大家應該是經常會遇到,現在問題就出現了,在綁定數據的時候,並沒有直接可以 使用的實體,注意,數據列表裡面咋看是Card實體,不過Card實體中,保存的是卡類型ID,總不能把卡類 型ID顯示給用戶看吧?這裡我們要明確的輸出卡類型的名稱。

於是我們就悲劇了,因為目前實例化的實體根本沒有用上。

所以我們又不得不重新寫一個SQL語句

1 select cardid, startno, endno, cardkindname
2   from card card
3   inner join cardkind kind on card.cardkindid = kind.cardkindkindid

然後再綁定。如果之後還需要進一步的詳細信息,我們會根據主鍵ID,再次查詢數據庫,悲劇就一直 這樣循環進行下去。

起始悲劇最一開始的原因就在於使用了代碼生成器生成的表實體,而不是業務實體。

從顯示的角度來說,CardKindID是必定和CardKindName同時出現的,我們希望一次可以讀取更多的信 息保存起來,因為內存不是我們考慮的范疇。

現在我們重新設計一下我們的實體,通過聚合的方式,重新整合兩個實體類,CardKind實體類不變, Card實體類重寫,最關鍵的地方:我們將原來CardKindID的屬性刪除,然後添加一個CardKind的屬性,注 意,克隆方法也要重寫。

為了醒目直觀,我這裡只貼改動的代碼

01 ///// <summary>
02         ///// 卡類型Id
03          ///// </summary>
04         //private decimal m_CardKindID;
05          /// <summary>
06         /// 卡類型
07           /// </summary>
08         private CardKind m_CardKind;
09  ///// <summary>
10         ///// 卡類型主鍵Id
11          ///// </summary>
12         //public decimal CardKindId
13          //{
14         //    get { return m_CardKindID; }
15          //    set { m_CardKindID = value; }
16         //}
17          /// <summary>
18         /// 卡類型
19           /// </summary>
20         public CardKind CardKind
21          {
22             get { return m_CardKind; }
23              set { m_CardKind = value; }
24         }
25 ///  <summary>
26         /// 克隆 
27          ///  </summary>
28         /// <returns></returns>
29          public new Card Clone()
30         {
31              Card card = base.Clone() as Card;
32             card.m_CardKind =  this.CardKind.Clone();
33             return card;
34          }

這樣,我們以後再使用是不是方便了很多?我們在實例化Card實體的時候,附帶將CardKind信息也獲 取到了,再涉及到卡類型名稱的地方,我們直接就可以用 card.CardKind.CardKindName的方式獲取,而 不用再次讀取數據庫。

好吧,文章到這裡,接下來的數據列表的綁定,和雙擊彈出詳細信息的操作,就看你的了~

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved