2010-02-09 88 views
7

我的目標是有一個使用WPF的應用程序,它是一個3層體系結構。 UI,BLL和DAL ...我想使用MVVM,但我不確定這是如何與3層架構協同工作的,或者它是完全不同的。所以考慮到這一點,我有幾個問題:MVVM WPF中使用LINQtoSQL的DAL和BLL

1)LINQtoSQL:我讀過很多網上說,LINQ替換你的DAL,並看到很多文章說這是一個壞主意。我認爲這是一個壞主意,但是,我在這裏放什麼?什麼是我回到BLL的數據類型? IQueryable的?的ObservableCollection?我沒有任何線索。

2)BLL:我想讓這個服務在服務器上運行,這樣當我需要進行更改時,我不需要重新部署整個應用程序,我只需要重新啓動服務。但是,我不確定從哪裏開始。 3)使用BLL,我想我很困惑數據是如何通過從DAL到接口的所有層。我已經做了大量的研究,但是我還沒有看到任何人談論WPF應用程序在使用SQLMetal和BLL運行DAL中使用MVVM與LINQ在服務器上。任何人都可以將我指向正確的方向嗎?或者一本書可以得到?

+0

「不幸的是,我們學校沒有教授任何專有技術」lol – Will 2010-02-09 15:14:11

回答

2

麥克,

你的問題是真的很酷,我喜歡它。首先,隨意嘗試一下 - 每個項目都不同,所以沒有一個適用於任何地方的規則。這就是爲什麼我會建議將DAL留給LINQ 2 SQL。這個偉大的工具將會處理它,你不必擔心。其次 - 你提到了3層架構,但爲什麼模型沒有位置?由於所有模型都是自動生成的(例如SQLMetal),因此您不必擔心映射。所以,如果你不無聊呢,讓我來回答你所有的3個問題:

  1. 跳過DAL和carefuly觀察你的項目 - 如果你有一個感覺,它缺乏這層 - 添加它(它將包含LINQ2SQL查詢)。第二部分 - 您可以返回任何您想要的內容,但使用IEnumerable <>或IQueryable <>對您的模型進行參數化將會非常方便。

  2. 我的直覺告訴我,你將需要WCF--在這種情況下,你應該能夠將整個業務邏輯包裝在一個不錯的契約中,然後實現你的願望。

  3. 這是最簡單的:)因爲BLL層實際上是一些Contract(接口)的實現,所以您可以設計該接口爲您提供所需的所有數據。例如:

合同/接口:

IEnumerable<User> GetTallUsersOver40(); 
IEnumerable<User> GetShortUsersOver60(); 
... 

這「所有圖層」你在談論縮減到一個單一的LINQ2SQL查詢執行。如果你需要更多的邏輯 - 把它放在這一層。

我想用MVVM,現在怎麼樣?答案比您想象的要簡單 - 只需準備好您的觀點並查看模型,並簡單地使用您的BLL合同/接口實施。

請詢問您是否還有其他問題!

+0

模型 - 視圖 - 視圖模型中的「模型」本質上就是我將在WCF中包裹的BLL? – Mike 2010-02-12 04:06:21

+0

不完全。請想像一個模型,就像一個單獨的圖層,它只是爲了映射(或者字面上「模型化」)持久數據。簡而言之:模型是一組專爲建模數據庫而設計的類。由於LINQ 2 SQL爲你建模(這簡直太棒了),請不要擔心這個問題 - 你提供了所有的建模類:)如果你還有其他問題 - 請不要猶豫,問問他們。 – 2010-02-12 09:08:05

+0

嗯...我想我在設想圖層時遇到了麻煩。讓我們看看我是否有這個權利。在頂部,我們已經看到有一個關聯的.cs文件,理想情況下沒有代碼在那裏。該視圖綁定到ViewModel,它本質上是View的一個適配器。 (現在這是我開始迷失的地方),因爲模型由LINQtoSQL處理,我是否在每個ViewModel中引用/連接到WCF BLL?最後,讓BLL參考DAL?而dataContext進入DAL? – Mike 2010-02-14 04:28:00

2

我會盡量提供一些見解,雖然我不是專家,但我已經解決了這些問題。

  1. LINQ to SQL實際上是相當不錯的,它應該做什麼 - 這是取代你的DAL。但是不要將IQueriable向上返回給BLL,因爲這樣可以(或者至少提示可能性)BLL直接查詢數據庫。您應該將數據對象傳遞給BLL並讓它構造一個匹配的業務對象。 另請注意: LINQ本身可以用在任何層(實際上是C#的最佳特性之一)。 LINQ to SQL是LINQ語句轉換爲SQL查詢的機制。

  2. BLL作爲服務是一種自然選擇。爲表示層提供一個向上的界面(這裏WCF服務是一個不錯的選擇)。

  3. BLL根據從DAL接收的數據生成業務對象。爲了提供良好的圖層解耦,應該爲DAL和BLL對象使用不同的類。不要在表示層和數據層之間創建依賴關係。

0

偉大的問題。我不認爲有任何一個地方都有答案。當我們開始一個新項目時,我有非常類似的問題。 MVVM實際上只是一種表現模式,並不關心你列出的所有細節。 Laurent Bugnion有一個很好的框架,可以將所有東西粘合在一起。

  1. LINQ2SQL很酷,但VS08的設計人員可能會很麻煩。看看http://plinqo.com/與CodeSmith一起使用來生成DAL,我認爲它甚至可以執行帶有合同的BLL。另一個生成選項是Oleg Sych T4 templates我們在LINQ2SQL中遇到的一個問題是單數據環境。如果你不需要模塊化,這不是問題。

  2. 我同意其他人對數據合同的看法,看看Plinqo能夠產生什麼。它可以爲你節省很多時間。

  3. 這些數據通常會在對象中運行。像其他人說的一樣,確保你在所有圖層之間保持一致,這樣你就沒有依賴關係。

當你到達MVVM部分時,你會打開一個全新的蠕蟲罐。我不認爲MVVM上有很多或任何書籍。這仍然是一個新的時尚。

0

好問題,我在WCF/WPF學習曲線的苗圃斜坡上,所以我處於與你類似的位置。我的2美分:

  1. 還沒有進入Linq to SQL,我是舊學校,習慣編寫存儲過程和視圖。我目前使用這些來填充DTO類 - 也就是說,沒有方法的類,只是表示數據的屬性。我知道我可能在這個曲線背後。

  2. 使您的BLL成爲WCF服務 - 將服務契約和數據契約置於其自己的程序集中,然後將其包含在您的客戶端,它們成爲您的模型或其中的一部分。

  3. 在您的客戶端應用程序中,包含對包含服務合同和數據合同的程序集的引用。數據契約然後成爲你的模型,你的ViewModels可以包裝這些模型並公開它們的屬性(爲數據綁定實現INotifyPropertyChanged)。

我使用O'Reilly出版的編程WCF服務,學習WCF服務,並且我發現相當不錯的編程WPF。我不知道任何關於MVVM的書,但網絡上有很多東西。

+0

爲什麼要引用BLL程序集而不是WCF Web服務?爲什麼WCF需要呢? – 2010-02-10 09:11:47