2011-01-24 124 views
1

鑑於比如說,一個銀行帳戶結構..存儲庫模式繼續 - 類方法或存儲庫方法?

class Account 
{ 
virtual int Id { get; set; } 
virtual int Balance { get; set; } 
} 

我想跟蹤完成交易,所以說一個簡單的類...

class Transaction 
{ 
virtual int Id { get; set; } 
virtual Account Account { get; set; } 
virtual DateTime Timestamp { get; set; } 
virtual int Amount { get; set; } 
} 

假設我想跟蹤交易完成了,這是更聰明的方法嗎?

interface IAccountRepository 
{ 
void Deposit(int account, int amount) 
} 

或...

class Account 
{ 
void Deposit(int amount) 
{ 
    // this one is easier, but then I have to repeat 
    // myself because I need to store the Transaction 
    // in the database too. 
} 
} 

Repository模式似乎是最完整的,因爲它有一個手柄,工作/ ORM /會話的單元(使用NHibernate) - 但使用類級別的方法似乎更直接,因爲它更符合標準的面向對象的原則'對此對象執行此操作'。

我的問題是,如果我想記錄事務,那麼我必須確保它們也保存爲數據庫對象。走上第二條路線,採用班級水平的方法,我不能在Account班裏這樣做,所以我最終不得不重複自己。

我的另一種選擇是另一個抽象..

interface ITransactionRepository 
{ 
void CreateTransaction(int account, int amount); 
} 

的正常工作,這樣的包A和B在一起,因爲我會發現該帳戶在TransactionRepository,然後執行它Deposit方法,但它不真的不覺得這是一個明智的做法。我不知道爲什麼,我的直覺告訴我這不是最好的選擇。

這不僅適用於這一套課程,當然 - 這是一個設計原則。如果你有任何想法,我想看看更多的資深程序員會在這種情況下做什麼。

回答

1

我將sugguest帳戶上的CRUD(創建,讀取,更新,刪除)操作使用存儲庫模式。

interface IAccountRepository 
{ 
    Add(Account acc); 
    Remove(Account acc); 
    Account GetAccountById(int account); 
    Update(Account acc); 
} 

然後把存款方式在賬戶類像你提到的

class Account 
{ 
    void Deposit(int amount) 
    { 
    } 
} 

然後你通過資源庫訪問帳戶更新帳戶

// Get the account by id 
Account acc = rep.GetAccountById(23143); 
// Deposit the money 
acc.Deposit(21.23); 
// Update if needed 
rep.UpdateAccount(acc); 

Transations可以在完成類似的方式,但我可能會存儲帳戶ID,而不是Transcation中的帳戶實例。

class Transaction 
{ 
virtual int Id { get; set; } 
virtual int AccountId { get; set; } 
virtual DateTime Timestamp { get; set; } 
virtual int Amount { get; set; } 
} 
0

你的問題是一個很好的例子,從結構性數據庫/ OO不匹配中產生的問題。根據我的經驗,人們傾向於贊成您描述的第一種選擇 - 繞過Account業務對象,並使用存儲庫將事務存儲在數據庫中。

我強烈建議不要讓您的數據庫結構影響業務層設計。業務對象用於實現業務行爲。當您直接從業務角度訪問屬於Account類的操作時,您的業務規則將最終位於一個奇怪的位置 - 以外的地方 Account類。

要回答你的問題,我總是在這些情況下是如下的方法:在你的業務邏輯

  1. 堅持OO原則。根據真實世界的流程構建您的類和交互,因此業務規則最終會在您期望的位置出現。

  2. 爲數據庫提供一個面向存儲的視圖。我的意思是你的存儲庫不需要模仿你的業務對象的結構。例如,實施一個爲帳戶和交易執行CRUD的存儲庫。