2012-03-19 111 views
3

我想根據最佳實踐來構建我的WPF MVVM應用程序。我必須從很多現有的代碼開始,因此不能立即解決所有結構缺陷。我喜歡以下解決方案結構。業務對象和業務邏輯有什麼區別

http://www.paulspatterson.com/technology/dot-net-development/mvvm-and-wpf-for-vb-net-series-2-part-1-again/

此分離溶液分爲以下項目; BusinessLogic,BusinessObjects,基礎設施(通用可重用實用程序),WPF Shell和模塊(使用IOC容器注入的應用程序組件)。

我知道業務對象表示人類世界的實體,而業務邏輯是這個問題中討論的實現細節。

What are Business Objects and what is Business Logic?

因此,使用MVVM沒有業務對象只是成爲一個愚蠢的容器實際上並沒有做任何其他不是等到有其性質由外部業務邏輯改變了嗎?我沒有看到如何將業務對象從業務邏輯中分離出來,以便能夠將它們放在單獨的程序集中。

採取以下巨大簡化的代碼:

public class Chart 
{ 

    private SizeChart _activeChartSize = new SizeChart(); 

    public void Draw() { 
     // Size the chart object 
     _activeChartSize.Size(this); 
     // Do other draw related things 
    } 

} 

public class SizeChart 
{ 

    public void Size(Chart chartToSize) { 
     // Manipulate the chart object size 
    } 

} 

在上述(我的腦海裏至少)MVVM溶液結構的SizeChart類將是業務邏輯和圖表類將是一個業務的上下文中對象,但將它們放置在不同的項目中將是循環依賴。是SizeChart類業務邏輯還是業務對象,以及如果我採用此提議的MVVM解決方案結構,SizeChart類應該位於解決方案結構中的什麼位置?

道歉,如果對某些人來說這是一個難以置信的明顯而簡單的問題,但是當你無法從一塊乾淨的板岩開始知道如何最好地開始將結構不良的代碼轉換爲結構良好的代碼時很困難。

+1

我不認爲將業務邏輯與其對象分開是一個好主意,因爲這會導致[貧血域模型](http://en.wikipedia.org/wiki/Anemic_domain_model)。 – 2012-03-19 11:56:04

回答

0

http://en.wikipedia.org/wiki/Business_object

業務對象A型可理解的實體爲業務層內部的演員在面向對象的計算機程序的n分層架構。 雖然程序可能實現類,通常以管理或執行行爲的對象結束,但業務對象本身通常不會執行任何操作,而是保存一組實例變量或屬性(也稱爲屬性)以及與其他業務對象的關聯,編制映射代表業務關係的對象。

http://en.wikipedia.org/wiki/Business_logic_layer

業務邏輯層業務邏輯層(BLL),也被稱爲域層,是compartmentalizing的軟件工程實踐。 在BLL中,對象可以進一步劃分爲業務流程(業務活動)和業務實體。業務過程對象通常實現控制器模式,即它們不包含數據元素,但具有協調業務實體之間的交互的方法。

所以基本上,一個業務對象建模一個實體(通常是一個真實世界對象,例如Employee或Account),而業務邏輯則便於業務對象之間以及其他應用層之間的交互。

我認爲最合適的答案是Daniel Hilgarth。他的回答是不要將業務邏輯與其對象分開,因爲這會導致anemic domain model

雖然我認爲Paul S Patterson提出的以下WPF MVVM解決方案結構是一個很好的解決方案,但我認爲它不適合每個人。

http://www.paulspatterson.com/technology/dot-net-development/mvvm-and-wpf-for-vb-net-series-2-part-1-again/

不同的業務邏輯和業務對象的項目的設立可能效果最好,如果你的業務對象是Data Transfer Objects (DTOs)例如Linq轉換爲SQL,而不是更復雜的對象,例如可能與業務邏輯緊密耦合的組合。

1

業務對象是一個相當無定形的術語 - 它是一個DTO,一個POCO,還是與一些業務邏輯拋出的組合?

給我,我會考慮不同的東西 - ChartSizeChart都是控制而不是「業務對象」或「商業邏輯」。這不是事實,他們有UI聲音的功能名稱,但他們實際上正在做UI或渲染相關的工作(大小和繪圖)。這些工作的數據收集將是分開的,並在調用SizeDraw之前分配給控件。

請注意,這個答案是不可知的MVVM,因爲它是一個紅鯡魚 - 你的問題是更密切相關的一般n層設計,其中你還加入MVVM。

+0

感謝您的回答。 Chart是一個POCO,專門用於Interop.Excel.Chart的抽象。我同意一般的n層設計評論,儘管考慮到術語似乎很含糊,知道在這種情況下我特別提到WPF MVVM並沒有什麼壞處。我明白你對控制的看法。如果沒有看到應用程序,我懷疑任何人都可以說解決方案的結構應該放在哪裏,但也許你可以描述你的解決方案結構的最佳實踐? – dior001 2012-03-19 12:14:20

1

最近我遇到了類似的項目。

我們有一個Web應用程序,允許管理員創建組。需要的規則之一是你不能創建兩個同名的組。我們最終做的是創建一個非常基本的對象,一個Group,然後創建一個名爲GroupService的服務。 GroupService執行規則檢查,以便當用戶調用GroupService.Save(Group)時,該服務熄滅並檢查名稱爲之前的組。如果找到該名稱,則會向用戶返回錯誤,並且不會發生保存。

在我們的案例中,層次結構是Controller has Services,服務有存儲庫,存儲庫最終提交到數據庫。在這些抽象概念中運行的是模型Group。但我們的模型不僅僅是一個「愚蠢」的對象。它確實包含數據字段本身的驗證邏輯,並具有聚合屬性以簡化數據綁定。

將此擴展到MVVM conecept,我會認爲View Model將具有包含業務邏輯的服務以及將被合併到View中的模型。很顯然,視圖將被綁定到ViewModel,但ViewModel會有一些Model對象綁定到的實例。