2012-07-30 81 views
2

我嘗試抽象我的特定領域的問題,以銀行賬戶,假設以下情況:我應該如何架構我的域模型

  • 我有一定的客戶的銀行密碼登錄。
  • 每個客戶可以擁有多個屬於同一登錄名的銀行賬戶。
  • 每個銀行賬戶可以有數千筆交易。

我設計的類結構folows(簡體):

public class Login 
{ 
    private List<Account> _bankingAccounts; 
    ....more fields, ctor, getters, setters... 
} 

public class Account 
{ 
    private List<Transaction> _transactions; 
    ....more fields, ctor, getters, setters... 
} 

public class Transaction 
{ 
    String _comment; 
    ....more fields, ctor, getters, setters... 
} 

好了,但如果我有讓我們說20的帳戶,每個人都有10000交易,我從數據庫裝載有將整個模型是一個大量的記憶,即使我不知道客戶是否需要所有這些交易。

我想建立一個更加簡化的模型是這樣的:

public class Login 
{ 
    private List<SimpleAccount> _bankingAccounts; 
    ....more fields, ctor, getters, setters... 
} 

public class SimpleAccount 
{ 
    ....more fields, ctor, getters, setters... 
} 

public class Account 
{ 
    private List<Transaction> _transactions; 
    ....more fields, ctor, getters, setters... 
} 

public class Transaction 
{ 
    String _comment; 
    ....more fields, ctor, getters, setters... 
} 

然後我將加載與簡化的帳戶(不包含所有事務)一個賬戶模式,只有我的用戶請求看交易一個特定賬戶我將加載這個單一的整個賬戶對象。

那樣可以嗎?有更好的方法嗎?

+0

對於一長串事務處理,您可以執行服務器端分頁 – JohnnBlade 2012-07-30 07:46:22

回答

6

從你的問題,我發現你的基本需求是ORM,因爲(如果我沒有錯)你想要兩件事
域模型映射

與lazzy loading
通過延遲加載我們的意思是,只有當我們試圖訪問它們時纔會加載關係對象。簡單地當你想看到一個你永遠不想要的特定學生數據自動加載學生的所有課程(可能是一個集合),除非不想要t o見他/她的課程(如果學生和課程有關係)。因此,對於你的問題
你應該使用ORM將爲您提供兩種解決方案:)
下面是淨

2

當您構建您的域名模型時,您不應該考慮性能問題,因爲域模型是您的域名,而不一定是您實施的內容。此外,如果您使用任何體面的ORM框架(例如,),則可以從數據庫中僅加載所需的數據,而不是整個對象圖。

1

正如Serg所說,績效思想屬於實施,而不是必要的領域模型。

如果你想避免加載整個帳戶,你應該實現某種延遲加載,例如:

public class Account 
{ 
    private List<Transaction> _transactions; 

    public List<Transaction> getTransactions() { 
     if(_transactions == null) { 
      loadTransactions(); 
     } 
     return _transactions; 
    } 
} 
+0

,但在這種情況下,我會將DataAccess放入域模型中。 – john84 2012-07-30 08:07:44

+0

@ john84使用支持透明(用於域模型)外部加載的DAL。 – 2012-07-30 08:08:54

+0

您可以通過分離接口和實現來將您的域模型從數據訪問中分離出來,例如Account實現IAccount,或者通過引入ServiceLayer,例如:_transactions = serviceFactory.makeTransactionService()。loadTransactions(); – 2012-07-30 08:53:00

0

提供的list of some ORM有一個叫事件採購這聽起來像它可以幫助你的模式。它依賴於事件的存儲(在你的情況下,這些是事務),而不是運行總數,所以你可以做更多的數據。

此模式遇到了您遇到的相同問題。因此,這種稱爲快照的模式還有一個補充。拍攝快照,比如說在每個月的末尾,可以讓您及時獲取時間點並將交易記錄載入最近的快照。快照將顯示該帳戶在快照點(可能是上次快照或帳戶打開事件的產品,其中所有事務處於重播之間)。

如果您的Google'活動採購快照'有大量文章討論該模式。希望這可以幫助。

相關問題