2009-08-14 40 views
2

我是一個團隊的一員,負責將舊版VB6 UI/COBOL數據庫應用程序改造爲現代。在我被聘用之前,我決定做出決定(主要是銷售,我敢肯定)要在數據庫之前重做用戶界面。所以,現在我們使用WPF和MVVM產生了很好的效果,到目前爲止令人驚歎,特別是使用CSLA作爲我們的Model層。C#CSLA業務對象困境:只讀與讀/寫

但是,由於我們的開發與舊產品的下一個版本並行,所以我們受到了一些限制。我們不能對COBOL數據庫的調用進行任何更改(或最小的更改)。到目前爲止,這一切都很好,儘管如此,如果你能相信的話,回到SQL Server的輝煌時代。

在我遇到了一個特別討厭的障礙,就是我們的BO設計是在處理列表中返回的「輕」商業對象和他們的「完整」對象。讓我試着構建一個例子:

比方說,我們有一個人對象在數據庫中的一堆字段。當我們在該表上進行搜索時,我們不會返回所有的字段,因此我們使用這些字段填充我們的精簡對象。這些字段可能是也可能不是整個人的子集。我們可能已經加入了兩個或兩個以檢索特定於搜索的其他信息。但是,如果我們想編輯我們的person對象,我們必須再次調用完整版來填充UI。這給我們留下了兩個對象,並嘗試在1個虛擬機中處理它們的狀態,同時試圖在刪除,編輯和添加後保持其所在的任何父對象同步人員列表。最初,我將我們的Lite人物體從ReadOnlyBase <>中派生出來。但現在我正在處理與完整BO列表相同的列表行爲,除了半滿,半精簡,我認爲我應該只是將輕量級和完整版從BusinessBase <中派生出來>並簡單地將lite版本的setter屬性設爲私有。

有沒有其他人遇到過,並找到了解決方案?在睡覺之後,我想出了這個潛在的解決方案。

public class PersonFull : BusinessBase<PersonFull> 
{ 
    ... 
} 
public class PersonLite : BusinessBase<PersonLite> 
{ 
    ... 
} 

public class Person : BusinessBase<Person> 
{ 
    public PersonFull PersonFull; 
    public PersonLite PersonLite; 
} 
public class PersonList : BusinessListBase<PersonList, Person> 
{ 
} 

顯然,一切都將是里昂證券登記性質等,但爲簡便起見,他們場還有:如果我們在另一個BO包裝完整版和精簡版版本,我們的BO的,像這樣的東西。在這種情況下,Person和PersonList將包含所有工廠方法。在搜索操作之後,PersonList將由其PersonLite成員全部填充且PersonFull對象全部爲空的Person對象填充。如果我們需要獲取完整版本,我們只需告訴Person對象,現在我們有我們的PersonFull對象,因此我們可以填充編輯用戶界面。如果Person對象被刪除,我們可以很容易地通過CSLA刪除程序來做到這一點,同時仍然保持我們所有正在收聽它的VM的列表的完整性。

所以,我希望這對每個人都有意義,如果有人有不同的解決方案,他們已經成功地僱用或批評這一個,無論如何!

謝謝!

(轉貼自:http://forums.lhotka.net/forums/thread/35576.aspx

回答

-1

如果你過目洛基的例子來與里昂證券的框架,你會發現,他始終分隔從讀取對象只/寫對象。我認爲這樣做是出於很好的理由,因爲這些行爲將會有很大的不同。只讀對象將基於更多的性能,它們的驗證將會非常不同,並且通常具有更少的信息。讀/寫對象不會基於性能,並嚴重依賴於驗證,授權等。

但是,這會給您帶來目前遇到的困境。我會做的是重載每個類的構造函數,這樣你就可以在彼此之間傳遞它們,並將你需要的內容「複製」出來。

事情是這樣的:

public class PersonLite : BusinessBase<PersonLite> 
{ 
    public PersonLite(PersonFull fullPerson) 
    { 
     //copy from fullPerson's properties or whatever 
    } 
} 

public class PersonFull : BusinessBase<PersonFull> 
{ 
    public PersonFull(PersonLite litePerson) 
    { 
     //copy from litePerson's properties or whatever 
    } 
} 

你可以使用工廠模式做到這一點爲好,這是洛奇的偏愛,我相信。

+0

我不完全確定你的建議是否應該解決。 Lite BO永遠不會填充完整的BO,因爲我們可以直接訪問數據庫,從lite版本的獨特數據中提取完整的BO。我想我可以看到一個完整版本在編輯後更新lite版本,但這不是真正的解決方法。 – opedog 2009-08-14 16:45:56

+0

lite版本將無法完整填充完整版本,但它可能足以顯示給用戶,並且可以延遲加載其餘數據。我在過去取得了一些成功。如果你試圖修改內存對象,那麼你的方法將會完全不同。 – Joseph 2009-08-14 16:54:07

+0

如果意圖是重新構建後端BO,現在前端已經完成,那麼爲什麼不將它用作測試用例,以便從包含所有屬性的新CSLA對象開始? – 2009-08-14 17:41:16

3
public class PersonLite : ReadOnlyBase<PersonLite> 
{ 
    public void Update(PersonFull person) { } 
} 

public class PersonFull : BusinessBase<PersonFull> 
{ 
    // blah blah 
} 

我會更新到「滿」對象所做的更改的「精簡版」的對象,並把它作爲ReadOnlyBase。請務必記住,ReadOnlyBase中的「ReadOnly」表示只能從數據庫中讀取的對象,並且永遠不會保存到它。不太優雅但更準確的名字應該是NotSavableBase,因爲這樣的對象除了提取物之外沒有任何其他物體的DataPortal_XYZ機器。出於顯而易見的原因,這些對象通常具有不可變屬性,但它們不必。 ReadOnlyBase來自Core.BindableBase並且實現了INotifyPropertyChanged,所以改變它的屬性值可以很好地處理綁定。

保存「完整」對象時,將新保存的實例傳遞給位於列表中的實例的Update(PersonFull)方法,並從「完整」對象更新「精簡」對象的屬性。

我已經使用了這種技術很多次,它工作得很好。