簡體   English   中英

通過服務更新大型實體

[英]Update of large entity through service

我們正在基於WCF(而不是Entity Framework)構建n層系統,並且我們已經討論了實現大型實體更新的最佳方法。 我們已經創建了DTO,並在將數據發送到客戶端時將域模型中的數據映射到theese中。 然后,客戶端進行一些更改,並在我們當前的實現中使用相同的DTO將其發送回去。 我們的某些實體可能具有80-100個屬性,但也許客戶僅對其中一個或幾個屬性進行了更改。 填充整個DTO並將其發送回,然后嘗試在服務器端找出實際上已修改的屬性,效率似乎很低。 有沒有更好的方法來實現這一目標,還是應該采用“蠻力”方法? 將來,我們需要支持非.Net客戶,因此我們不想將我們的解決方案與特定於.net的東西聯系在一起。

您可以做的一件事是允許客戶端發送增量更新。 您所有的對象都可以具有服務器管理的唯一GUID。

您可能有這樣的WCF方法來發送增量

  void UpdateProperty( Guid objguid ,
            string propertyname , string propertyvalue );

在服務器端,您可以使用guid找到對象並更新相應的屬性。

如果您的架構太大,則可以嘗試將XML與具有可選元素的XSD一起用作Web方法參數。 這不會綁定到特定平台。 您可以只發送已更改的元素以及唯一的密鑰標識符。

我們通過在每個DTO上包括一個更改屬性名稱的字符串數組來解決此問題。 服務中的更新代碼僅驗證和寫入名稱在此數組中的屬性。

為了簡化編碼,我們將此字符串數組放在抽象的基類中,並從中繼承了所有“可變的” DTO。 例如:

<DataContract>
Public MustInherit Class ChangeTrackableObject
    <DataMember> Public Property Changes As HashSet(Of String)
End Class

沒有<KnownType>屬性,因為在這種情況下不需要DTO多態。 DataContractSerializer僅使用繼承關系來獲取基類屬性,僅此而已。

從.NET和Java客戶端代碼來看,該系統似乎同樣有效。 Java客戶端將其視為字符串數組。 我們為.NET客戶端提供了擴展方法庫,使填充數據變得更加容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM