2010-03-17 52 views
3

我們正在使用WPF/Prism (Composite Application Library)構建下一個內部胖客戶端應用程序版本。當我們幾乎與客戶做我們的團隊是根據新的管理投入,此後不久:關於在不使用MVVM或類似軟件的情況下開發WPF應用程序的建議

  1. 我們再執導下降棱鏡框架,讓事情變得簡單。這包括不使用任何類型的Inversion of Control。

  2. 我們被指示在不使用MVVM或類似的情況下構建WPF應用程序;並且更多地遵循傳統的WinForm應用程序。這個想法是,如果開發人員在Visual Studio的設計器視圖中看到一個控件,那麼他應該能夠單擊該控件並準確瞭解它在做什麼而不必遍歷視圖模型(或類似視圖)。

  3. 我們現在的任務是使用一個主窗口構建WPF應用程序,使用Frame Control來包含內容,並在菜單項的框外使用功能區。我們提供的理由使用幀控制:

    a。我們將在框架中顯示Page(不是用戶控件)的視圖,然後在框架中加載頁面。

    灣當在框架中顯示新視圖時,當前視圖(頁面)將被關閉/處理,並且新視圖(Page)將在框架中佔據其位置。

    c。當開發人員在設計視圖中查看頁面時,他將能夠點擊任何控件並準確查看正在執行的操作。

鑑於1和2以上的限制,我們希望以呈現出建立該應用程序的另一種方法:

  1. 可以呈現爲替代使用「幀方法論「(上面第3項),但仍提供相同類型的功能。

  2. 不使用MVVM(請參閱上面的#1和#2)。

只要我們一直在考慮,任何爲我們可以提出一個替代建議的方向?我會要求將答覆保留在專業級別,並提前致謝。

+0

如果我心情很差,我會將整個應用程序作爲一個動態隱藏和顯示控件的大類實現。嘿,現在你可以看到*一個文件*中的所有內容! – kyoryu 2010-03-17 02:29:03

+1

我會暫緩寫這個問題的答案,直到我可以在不使用「非常愚蠢」的短語的情況下這樣做。 – 2010-03-17 07:31:19

回答

6

我個人試圖爭論使用Martin Fowler的演示模型。 (這是一個笑話,順便說一句...)

基本上,你被給予一個限制,說「使用WPF,但不使用任何使WPF可用的功能。」這聽起來像你的要求是這樣的,你會更好地解釋MVVM等模式的優點。

這聽起來像怪異的要求真的熬煮到這一點:

的想法是,如果一個開發人員認爲,在Visual Studio的設計視圖中的控制,那麼他(她)應該能夠點擊控制和看到它到底在做什麼

如果這是主要問題,並且您避免MVVM和其他類似模式的原因,我會認真花時間教育管理。根據名稱(而不是事件)來查看命令(按照設計師的看法)並不困難。

然而,在大規模應用中,關注點分離是關鍵。即使設計正確的Windows Forms應用程序也需要清楚地區分問題 - 但是使用基於事件的編程,這會變得更加困難,尤其是設計人員。如果您嘗試使用事件方法開發大規模,乾淨的應用程序,那麼您將擁有事件處理程序,但這些事件處理程序最終都需要將其工作委託給單獨的組件。

這實際上是增加的努力,一個額外的水平,從一個角度可理解性和維修點,對你有MVVM得到的頂部。有了MVVM,您只能看到ViewModel,這是非常容易發現的。


順便說一句 - 使用頁面而不是UserControl的「基本原理」沒有任何意義。你可以使用UserControls完成同樣的事情......使用Frame和Page的唯一原因是如果你想利用導航,在這種情況下,你不能直接處理舊頁面(或他們不斷得到再生)。此外,導航工具可能不會與功能區一起使用 - 兩種概念模型完全不同。

+0

謝謝里德。我們提出了類似的觀點,並一直被擊落。你肯定寫了一個深思熟慮的答覆,讚賞。目前,我們的目標是找到可以滿足開發人員和管理層要求的事情。 – 2010-03-17 01:39:42

2

有MVVM的批評可能適用於您的項目;然而,編程方法論的無理指示總是一場災難。

我們有框架和花費時間來構建圖層和分離的原因之一是爲了避免在「只需單擊Visual Studio中的按鈕以查看正在執行的代碼」時總會產生的編碼混亂。

可能沒有達到你被要求沒有類似的東西MVVM做什麼的一種方式,因爲任何擁有的架構很可能被標記爲太相似了。

不過,我已經使用了很多年,它提供簡單對象間的管道目前所謂Emesary你可能需要閱讀我的C# .NET Emesary walkthrough的系統。

但基本上它允許從而實現我的按鈕:

private void addButton_Click(object sender, RoutedEventArgs e) 
    { 
     GlobalTransmitter.NotifyAll(new Notification(NotificationType.CreateRecipe)); 
    } 

這可能是回答你的問題。它被炒作,小而簡單,但它運作良好。

我已經通過使用一個窗口,對於帶狀條(用戶控件包含列表視圖)的用戶控制,和用於框架部分的另一用戶控制來實現的解決方案的第二個問題。這第二個明顯的用戶控件是使用其他用戶控件使用非常簡單的視圖類構建的。所有視圖和控件都使用Emesary連接。

+0

理查德,你已經提出了一個有趣的替代Emesary看起來非常類似於Prism的EventAggregator。我會在明天進一步詳細介紹Emesary。謝謝您的回答。 – 2010-03-17 03:16:47

1

作爲一個學校項目,我不得不開發一個允許多人同時使用它的WPF客戶端。我用頁面。我的結論:節省大量的努力,並改用UserControls。

有時,頁面導航器(您將用於滾動瀏覽)往往會出錯,並導致很多問題。也許這是我的蹩腳編碼,但誰知道?

雖然我必須說,被稱爲「頁面」的控制有點誤導...我去了「尤里卡!」當我找到他們,並在此後發誓。

我完全同意#2(MS大家注意!)。如果你可以雙擊一個控件,它會很酷,並且它會讓你直接執行它的命令(或者如果它的命令缺少,那麼事件會)。但是,直到那時,請確保您將視圖和ViewModels組織在單獨的文件夾中。使用雙屏幕(或非常寬的屏幕)將允許您在項目中打開VS的兩個實例,一個圍繞視圖而另一個圍繞ViewModel(我的個人選擇是將Expression Blend放在視圖)。

雖然不是一個非常大的應用程序,我設法我的項目轉換爲適當 MVVM(即視圖模型爲每個UI元素,RelayCommands和調解員)在幾天之內,所以一旦你瞭解它,這不是太複雜執行。此外,還有一些工具(如Josh Smith的RelayCommand和Marlon Grech的Mediator - 順便說一句,完全免費),這使得MVVM變得一半難,兩倍強大。

使用沒有MVVM的WPF就像試圖在沒有叉子的情況下吃飯。如果您不打算利用WPF所提供的功能,那麼使用WinForms會更好。我的2美分。

0

我希望我可以說你的管理是完全錯誤的..但我不能說,因爲它不會是最準確的事實。我想你描述的變化的主要原因是新管理者不熟悉MVVM是UI開發新的彌賽亞的概念,或者另一個原因可能是受過教育的複雜開發人員與廉價開發人員的成本可以指導他們儘快完成工作,這是一個廣爲人知的精益發展理念。

所以,把所有我寫了這麼遠低於「不是你問什麼」,這裏是我的建議: 你仍然可以使用面向純做法對象,這意味着你可以擁有已經有方法的模型對象顯示UI信息。所以每個對象都將成爲一個窗口派生對象,這樣你就可以在SOC上放棄,但你仍然是OOP/OOD。

但LOL,下一階段將帶給您從視圖模型的分離 - 爲了不重複許多derrived窗戶繼電器在相同的數據相同的代碼...所以你的管理將批准MVC/MVP一樣好解決方案..如果他們想要WPF,從它到MVVM的距離有點短。

結論:您將不得不教您的經理爲什麼最好去MVVM,除非項目很短。

+0

我敢肯定,2010年3月要求廢話的那位經理早已不在了,如果他和這個項目還有機會(而且他得到了他所要求的),他們都被困在一堆不可收拾的東西里垃圾... – 2012-06-12 18:15:37

+0

@DeanK。關。所有的高級開發人員都離開了這個組織。這位經理仍然在附近,並且告訴上級管理人員他需要聘用初級/初級大學開發人員,以便他們能夠教他們。 – 2012-06-12 19:29:31

+0

@MetroSmurf非常感謝這次更新,瞭解這些理性和純粹的野心驅動,貪婪的爬蟲類大腦之間的衝突的最終結果總是很有趣:) – 2012-06-12 19:46:12

相關問題