2012-04-03 65 views
7

我們將很快開發大型企業桌面應用程序,並且我一直花費一些時間研究WPF + PRISM + MVVM方法,我已經掌握了很多大多數的概念和我喜歡它提供的模塊化。WPF WCF Prism和MVVM - 揭露實體的正確方法

我遇到的問題是如何構建服務層來獲取數據,特別是當這個服務是由一個模塊引入的,並且這個模塊具有依賴模塊可以使用它的想法。

我想抽象我的WCF數據服務內部的應用程序服務,並使用ServiceLocator來解析我的視圖模型中的具體實例,但即時通訊很難弄清楚它應該如何掛在一起,主要是由於我的entite存在WCF服務的一部分。

例如

模塊1 包含WCF服務+混凝土中的應用服務(ISearchService)+ WCF服務生成的實體(模型)

Module1.Infastructure - 包含應用服務的以下接口

public interface ISearchService 
{ 
     ObservableCollection<Person> Search(string search); 
} 

這將在UnityContainer中註冊,以便任何其他模塊都可以獲得模塊引用的具體實現。

我的問題是實體(Person)是在模塊本身(在WCF服務中)定義的,所以引入一個服務然後期望其他模塊能夠使用它意味着他們需要引用模塊本身不僅僅是模塊的基礎結構,除非我將服務提供給另一個組件。

我應該以這種方式公開我的EF模型中自動生成的實體嗎?

有沒有人有更好的解決方案?

+0

如果WCF服務應該返回'Model'對象或數據傳輸對象,您可能會對[我的這個問題](http://stackoverflow.com/q/4824058/302677)感興趣。我最終選擇了DTO,並發現讓它返回一個數據傳輸對象並使用類似[AutoMapper](http://automapper.codeplex.com/)將'DTOs'映射到'Models'和反之亦然 – Rachel 2012-04-03 14:05:18

+0

我喜歡這個想法,會在實體框架中使用POCO的基本上是一樣的東西? – 2012-04-03 14:34:39

回答

1

這是怎麼做到的。

我目前使用Silverlight + PRISM + MVVM + WCF(RIA)服務。

與當前項目建築

  • Application.Domain:包含所有EF代碼第一個實體,包括元數據和業務驗證。不包括數據庫生成。
  • Application.RIAServices:這是包含WCF RIA服務Web項目自動生成的類的項目。我可以在WPF和Silverlight中引用此項目

  • Application.RIAServices.Web:通過使用DbContext包含DomainServices和數據庫生成代碼的Webproject。這是應用程序的WCF RIA鏈接項目。RIAServices

  • Application.Infrastructure:這是它開始的地方。因爲就像你我有一個人/客戶服務使用接口ICustomerService。因爲我想在例如應用程序範圍內使用這個服務,而不僅僅是在ModuleA中,我把這個接口放在基礎結構中。所有項目都包含對該項目的參考。

  • Application.Modules.ModuleA - > Application.Modules.ModuleD:提供功能的常規模塊。我所有的模塊(使用WCF RIA服務)都有對Application.Infrastructure和Application.RIAServices項目的引用。

  • Application.Shell:啓動項目。擁有引導程序並註冊所有相關模塊。

閱讀蕾切爾的問題讓我想到了某些事情,我只是想離開我的結構,我是如何做到的。你可能有一個想法。我不想去DTO,因爲像WCF RIA服務這樣的驗證功能非常好,當出現錯誤並顯示錯誤消息時,它會自動反映到文本框中。期待着聽到您的意見和問題的結果/期

編輯:

Application.Domain還設有獨立的結構以及。

我有我的模特。只有需要映射到數據庫的容器純屬性。然後我有我的元數據文件夾。現在爲了這個工作,我需要與我的實體具有相同的名稱空間,並使實體部分。我創建一個Entity.metadata.cs文件,並在那裏創建一個internal sealed class EntityMetaData,複製屬性併爲它們添加屬性。通過使用Entity類上方的MetadataType屬性,它將所有這些屬性添加到EF/WCF RIA代碼生成器。

其中的一個屬性是CustomValidation它使用靜態類和方法參數並驗證服務器上的實體。或者,如果使用.shared.cs擴展名創建文件,它將生成到Application.RIAServices項目。

可能性

爲了回答你的問題,你可能只有1個選項,那就是你首先提出的。您可以創建一個Customer.Infrastructure項目。

這個項目包含了ICustomerService,Entity/DTO/POCO的接口,甚至可以實現這個ICustomerService或WCF服務。這就允許你所有的模塊引用這個項目,因此不會在模塊之間創建依賴關係。

+0

我發現的每個資源都聲明RIA服務在WPF中不受支持,是不是這種情況? – 2012-04-04 10:40:31

+0

我想限制我的服務,所以他們只處理與模塊相關的實體,即使它們可能共享或不共享相同的數據庫,我的問題是我結束了我的EF POCOS - 我生成的服務實體,我不真的很想公開,然後可能是另一個DTO--它只是代表了每個實體代表了不少次的混亂.. – 2012-04-04 10:43:31

+0

@RichardFriend我需要看看那個。我可以參考該項目創建一個參考並創建一個customercontext。但是我沒有在運行時看到它。我會看一下。關於你的問題,可能有一種方法來限制容器解析實例。還會看看 – 2012-04-04 12:04:12

0

您可以定義一個IPerson接口,使您的實體(使用部分類)實現它,並在合同中使用它。如果您願意,另一種選擇是將您的實體定義拆分爲它們自己的程序集,或者將它們包含在合約程序集中。

+0

我的確想到了這一點,並且我喜歡這個想法,但是當你考慮實體是自動生成的時候,創建這些接口並保持它們與數據模型同步的工作非常多。有興趣瞭解其他人接近這個。 – 2012-04-03 13:09:44

+0

你不能自動生成一個接口嗎?至少作爲一個起點,可以爲你節省大量的打字工作。 – 2012-04-03 13:10:25

+0

如何創建新實體,我將不得不註冊具體的實體對其界面,並使用'ServiceLocator'或統一容器來解決,這只是感覺錯誤。 – 2012-04-03 14:02:33