2010-10-26 99 views
2

我正在重寫我們的應用程序。我們正在構建DataMapper以在我們的DAL中工作。我的問題涉及到BLL中的一個複雜對象,它被傳遞給DataMapper以被持久化。DAL Datamapper堅持胖對象

假設這個對象有許多屬性,包括其他對象的列表。

即...

public class Customer 
{ 
    public String name; 
    public String age; 
    public String ShoeSize; 
    public List<Address> a; 
    public List<Orders> o; 
{ 

在的情況下,也許「時代」是,是在BLL更新的唯一領域。

將此持久化到數據庫的最佳做法是什麼?

你會堅持整個結構嗎?或者我怎樣才能構造這個,以便我的DataMapper知道哪些字段發生了變化,以便我不必更新數據庫中的整個結構?我想我可能會爲每個屬性都有一些IsDirty字段,但這可能會非常快速地混亂。

感謝,

兆瓦

回答

1

如果保持原來的對象在內存中,並通過在新的「版本」與變化,你可以檢查新的對象更改,只有保存。

public class CustomerMapper { 
    // ... 
    public void Update(Customer original, Customer update) 
    { 
     // check each property for changes 
    } 
    // ... 
} 

更新後,將原始對象替換爲新的。但是,如果您有多個線程,請注意併發性問題。

+0

感謝。這可能工作。我只需要看看處理這些併發問題。 – 2010-10-27 18:58:22

+0

或者只是從數據庫中獲取原始數據,並在保存更改之前將其與修改後的數據進行比較。 – jgauffin 2010-10-27 19:19:59

+0

@jgauffin這也可以工作,但需要額外訪問數據庫。取決於系統和設置。 – 2010-10-27 22:02:57

0

爲什麼要重新發明輪子?我已經完成了幾個數據層,這不值得冒險。當使用現有的ORM時,所有這些問題(以及許多你沒有想到的)已經被處理了。我的最愛是nhibernate。它可以給你很大的力量,或者以幾乎爲零的配置修復一切。

看看這裏:

+0

謝謝。如果我可以在這個項目上使用一個,那將會很好。 – 2010-10-27 18:59:22

+0

爲什麼不呢?你正在重寫應用程序。 =)只要列表/集合實現了IList或Set,你現有的胖對象應該可以正常使用nhibernate。換句話說,您只需使用nhibernate而不是當前的數據映射器(您正在構建)。沒有太多的調用代碼的變化。 – jgauffin 2010-10-27 19:20:30