4

我嘗試使用僅Silverlight的UI爲以數據爲中心的應用程序設置乾淨且靈活的應用程序框架。我希望嚴格分析問題,並希望儘可能靈活(例如,稍後交換ORM),同時還要減少代碼量。使用Silverlight,WCF和nHibernate的多層體系結構

我花了幾個星期找出一個合適的架構,雖然我最近的做法似乎符合我的要求,我還沒有完全相信,這一方式將是最好的,在技術上是可行的。

這裏是我的解決方案資源管理器的樣子:

  • MyCompany.MyApplication.Entities
    類庫 - 項目,該項目只包含域(業務)對象,如客戶,不會忽略等等。這些是帶有[Serializable] - 屬性的POCO,但不包含任何其他代碼。所有屬性都標記爲虛擬的,以便類可以派生和覆蓋屬性。

  • MyCompany.MyApplication.DataAccess
    類庫 - 項目,其中包含了NHibernate的 - 特定代碼(會話)來加載,保存和刪除域對象。該項目引用了實體項目以及nHibernate庫。

  • MyCompany.MyApplication.Core
    類庫 - 項目,該項目包含業務邏輯,而往往只是映射的方法形成的數據訪問 - 項目,如GetAllCustomers,SaveCustomer等 它必須引用Entities-project和DataAccess-project。

  • MyCompany.MyApplication.Web
    的Web應用程序 - 工程,它承載了Silverlight的客戶端應用程序,也是WCF服務與客戶端進行通信。爲了將域對象公開到客戶端,這些類會派生出來,並且所有屬性都將被覆蓋並標記爲[DataMember] - 屬性。它提到了實體項目和核心項目。

  • MyCompandy.MyApplication.Silverlight
    Sivlerlight 3.0 - 項目,它代表了用戶接口。它只有對Web項目公開的WCF服務的服務引用。實際的域對象是不可訪問的,但自動生成的代理類將替換它們。

請告訴我,你對這個架構有什麼看法,如果有任何衝突!進一步的問題:有沒有什麼辦法,以避免域的對象是虛擬和需要覆蓋它們,以使它們可訪問槽WCF的屬性?

最好的問候, 丹尼爾·蘭

回答

1

丹尼爾,你是不會得到解決虛擬財產的nhiberante要求。你有沒有想過使用Dto的?

+0

我實際上沒有得到,我怎麼可以從使用DataTransferObjects獲益?據我所知,他們「只是」封裝我的BusinessObjects ...? – 2010-01-28 13:19:35

+0

當您需要修改您的業務對象時,特別是在添加或刪除屬性時,這個好處來自於此。當您更改實體/業務/域對象時,您的Web服務合同將發生變化,從而中斷您的Web應用程序。擁有DTO允許您更改實體,同時允許依賴於Web服務的應用程序在不更改的情況下繼續工作。 – 2010-01-28 23:17:27

+0

看看這些問題 http://stackoverflow.com/questions/1688473/dtos-vs-serializing-persisted-entities http://stackoverflow.com/questions/1190718/how-do-i-serialize- all-properties-of-nhibernate-mapped-object http://stackoverflow.com/questions/1958684/nhibernate-how-do-i-xmlserialize-an-isett 希望這些幫助 – 2010-01-28 23:19:24