En İyi Uygulamalar: Veri Sözleşmesi Sürümü Oluşturma
Bu konuda, zaman içinde kolayca geliştirilebilen veri sözleşmeleri oluşturmaya yönelik en iyi yöntemler listelanmaktadır. Veri sözleşmeleri hakkında daha fazla bilgi için Veri Sözleşmelerini Kullanma başlığına bakın.
Şema Doğrulama ile ilgili not
Veri sözleşmesi sürüm oluşturmanın tartışılmasında, Windows Communication Foundation (WCF) tarafından dışarı aktarılan veri sözleşmesi şemasının, öğelerin varsayılan olarak isteğe bağlı olarak işaretlenmesi dışında herhangi bir sürüm oluşturma desteğine sahip olmadığını unutmayın.
Bu, yeni veri üyesi ekleme gibi en yaygın sürüm oluşturma senaryolarının bile belirli bir şemayla ilgili olarak sorunsuz bir şekilde uygulanamayacağı anlamına gelir. Veri sözleşmesinin daha yeni sürümleri (örneğin, yeni bir veri üyesiyle) eski şemayı kullanarak doğrulamaz.
Ancak, katı şema uyumluluğu gerekmediği birçok senaryo vardır. ASP.NET kullanılarak oluşturulan WCF ve XML Web hizmetleri de dahil olmak üzere birçok Web hizmeti platformu varsayılan olarak şema doğrulaması gerçekleştirmez ve bu nedenle şema tarafından açıklanmayan ek öğeleri tolere eder. Bu tür platformlarla çalışırken, birçok sürüm oluşturma senaryosu daha kolaydır.
Bu nedenle, iki veri sözleşmesi sürüm oluşturma kılavuzu kümesi vardır: katı şema geçerliliğinin önemli olduğu senaryolar için bir küme ve olmadığı durumlarda senaryolar için başka bir küme.
Şema Doğrulaması Gerektiğinde Sürüm Oluşturma
Tüm yönlerde (yeniden eskiye ve eskiden yeniye) katı şema geçerliliği gerekiyorsa, veri sözleşmeleri sabit kabul edilmelidir. Sürüm oluşturma gerekiyorsa, farklı bir ada veya ad alanına sahip yeni bir veri sözleşmesi oluşturulmalıdır ve veri türünü kullanan hizmet sözleşmesi uygun şekilde sürümlenmelidir.
Örneğin, bir işlemle PostPurchaseOrder
adlandırılan PoProcessing
bir satın alma siparişi işleme hizmet sözleşmesi, veri sözleşmesine uygun bir PurchaseOrder
parametre alır. Sözleşmenin değişmesi PurchaseOrder
gerekiyorsa, değişiklikleri içeren yeni bir veri sözleşmesi PurchaseOrder2
oluşturmanız gerekir. Ardından sürüm oluşturma işlemini hizmet sözleşmesi düzeyinde işlemeniz gerekir. Örneğin, parametresini PurchaseOrder2
alan bir PostPurchaseOrder2
işlem oluşturarak veya işlemin bir veri sözleşmesi aldığı PostPurchaseOrder
bir PoProcessing2
PurchaseOrder2
hizmet sözleşmesi oluşturarak.
Diğer veri sözleşmeleri tarafından başvuruda bulunan veri sözleşmelerindeki değişikliklerin de hizmet modeli katmanına genişletildiğini unutmayın. Örneğin, önceki senaryoda veri sözleşmesinin PurchaseOrder
değişmesi gerekmez. Ancak, bir veri sözleşmesinin Customer
veri üyesini içerir ve bu da veri sözleşmesinin Address
değiştirilmesi gereken bir veri üyesini içerir. Bu durumda, gerekli değişikliklerle bir Address2
veri sözleşmesi, veri üyesini içeren Address2
bir Customer2
veri sözleşmesi ve veri üyesi içeren bir PurchaseOrder2
Customer2
veri sözleşmesi oluşturmanız gerekir. Önceki örnekte olduğu gibi hizmet sözleşmesinin de sürümüne sahip olması gerekir.
Bu örneklerde adlar değiştiriliyor olsa da (bir "2" eklenerek), bir sürüm numarası veya tarih içeren yeni ad alanları ekleyerek ad alanlarının yerine ad alanlarının değiştirilmesi önerilmektedir. Örneğin, http://schemas.contoso.com/2005/05/21/PurchaseOrder
veri sözleşmesi veri sözleşmesi olarak http://schemas.contoso.com/2005/10/14/PurchaseOrder
değişir.
Daha fazla bilgi için bkz. En İyi Yöntemler: Hizmet Sürümü Oluşturma.
Bazen, uygulamanız tarafından gönderilen iletiler için sıkı şema uyumluluğunu garanti etmeniz gerekir, ancak gelen iletilerin kesinlikle şema uyumlu olmasını sağlayamazsınız. Bu durumda, gelen bir iletinin gereksiz veriler içermesi tehlikesi vardır. Fazlalık değerler WCF tarafından depolanır ve döndürülür ve bu nedenle şema geçersiz iletilerin gönderilmesiyle sonuçlanır. Bu sorunu önlemek için yuvarlama özelliği kapatılmalıdır. Bunu yapmanın iki yolu vardır.
Arabirimi türlerinizin hiçbirinde uygulamayın IExtensibleDataObject .
özelliği olarak ayarlanmış
true
hizmet sözleşmenize IgnoreExtensionDataObject bir ServiceBehaviorAttribute öznitelik uygulayın.
Yuvarlama hakkında daha fazla bilgi için bkz . İletme Uyumlu Veri Sözleşmeleri.
Şema Doğrulaması Gerekli Olmadığında Sürüm Oluşturma
Sıkı şema uyumluluğu nadiren gereklidir. Birçok platform, şema tarafından açıklanmayan ek öğeleri tolere eder. Bu durum tolere edilebildiği sürece, Veri Sözleşmesi Sürüm Oluşturma ve İleTme Uyumlu Veri Sözleşmeleri'nde açıklanan özelliklerin tamamı kullanılabilir. Aşağıdaki yönergeler önerilir.
Daha eski bir sürümün beklendiği bir türün yeni sürümlerini göndermek veya yeni sürümün beklendiği eski bir sürümü göndermek için yönergelerin tam olarak izlenmesi gerekir. Diğer yönergeler kesinlikle gerekli değildir, ancak şema sürümü oluşturmanın geleceğinden etkilenebileceği için burada listelenmiştir.
Tür devralma yoluyla veri sözleşmelerini sürüme eklemeye kalkışmayın. Sonraki sürümleri oluşturmak için, var olan bir türdeki veri sözleşmesini değiştirin veya yeni bir ilişkisiz tür oluşturun.
Devralma işleminin sürüm oluşturma mekanizması olarak kullanılmaması ve belirli kurallara uyulması koşuluyla, devralma işleminin veri sözleşmeleriyle birlikte kullanılmasına izin verilir. Bir tür belirli bir temel türden türetilirse, gelecekteki bir sürümde (aynı veri sözleşmesine sahip olmadığı sürece) farklı bir taban türünden türetilmiş olmasını sağlamayın. Bunun bir özel durumu vardır: Hiyerarşiye bir veri sözleşmesi türü ile temel türü arasında bir tür ekleyebilirsiniz, ancak yalnızca hiyerarşideki diğer türlerin olası sürümlerindeki diğer üyelerle aynı adlara sahip veri üyeleri içermiyorsa. Genel olarak, aynı devralma hiyerarşisinin farklı düzeylerinde aynı adlara sahip veri üyelerini kullanmak ciddi sürüm oluşturma sorunlarına yol açabilir ve bundan kaçınılmalıdır.
Veri sözleşmesinin ilk sürümünden başlayarak, her zaman yuvarlak kopyalamayı etkinleştirmek için uygulayın IExtensibleDataObject . Daha fazla bilgi için bkz . İletme Uyumlu Veri Sözleşmeleri. Bir türün bir veya daha fazla sürümünü bu arabirimi uygulamadan yayımladıysanız, türün sonraki sürümünde uygulayın.
Sonraki sürümlerde, veri sözleşmesi adını veya ad alanını değiştirmeyin. Veri sözleşmesinin temelini oluşturan türün adını veya ad alanını değiştiriyorsanız, özelliği gibi Name uygun mekanizmaları kullanarak veri sözleşmesi adını ve ad alanını koruduğundan DataContractAttributeemin olun. Adlandırma hakkında daha fazla bilgi için bkz . Veri Sözleşmesi Adları.
Sonraki sürümlerde hiçbir veri üyesinin adını değiştirmeyin. Veri üyesinin temelini oluşturan alanın, özelliğin veya olayın adını değiştiriyorsanız, mevcut veri üyesi adını korumak için öğesinin özelliğini DataMemberAttribute kullanın
Name
.Sonraki sürümlerde, bir veri üyesinin temelini oluşturan hiçbir alanın, özelliğin veya olayın türünü değiştirmeyin; böylece bu veri üyesi için sonuçta elde edilen veri sözleşmesi değişir. Beklenen veri sözleşmesini belirleme amacıyla arabirim türlerinin ile eşdeğer Object olduğunu unutmayın.
Sonraki sürümlerde, özniteliğinin özelliğini ayarlayarak Order mevcut veri üyelerinin sırasını değiştirmeyin DataMemberAttribute .
Sonraki sürümlerde yeni veri üyeleri eklenebilir. Her zaman şu kurallara uymalıdır:
IsRequired özelliği her zaman varsayılan değerinde
false
bırakılmalıdır.Üye için varsayılan veya sıfır değeri
null
kabul edilemezse, üyenin gelen akışta mevcut olmaması durumunda makul bir varsayılan değer sağlamak için kullanılarak OnDeserializingAttribute bir geri çağırma yöntemi sağlanmalıdır. Geri çağırma hakkında daha fazla bilgi için bkz . Sürüme Dayanıklı Serileştirme Geri Çağırmaları.özelliği, DataMemberAttribute.Order yeni eklenen tüm veri üyelerinin mevcut veri üyelerinden sonra göründüğünden emin olmak için kullanılmalıdır. Bunu yapmanın önerilen yolu şu şekildedir: Veri sözleşmesinin ilk sürümündeki veri üyelerinden hiçbirinin özellik kümesi olmamalıdır
Order
. Veri sözleşmesinin 2. sürümünde eklenen tüm veri üyelerinin özellikleri 2 olarak ayarlanmalıdırOrder
. Veri sözleşmesinin 3. sürümünde eklenen tüm veri üyelerinin 3 olarak ayarlanmış olması gerekirOrder
. Birden fazla veri üyesinin aynıOrder
sayıya ayarlanmasına izin verilebilir.
Özellik önceki sürümlerde varsayılan özelliğinde bırakılsa IsRequired bile sonraki sürümlerdeki veri üyelerini
false
kaldırmayın.Mevcut veri üyelerindeki
IsRequired
özelliği sürümden sürüme değiştirmeyin.Gerekli veri üyeleri için (burada
IsRequired
),true
özelliği sürümden sürüme değiştirmeyinEmitDefaultValue
.Dallanmış sürüm oluşturma hiyerarşileri oluşturmayı denemeyin. Başka bir deyişle, yalnızca bu yönergelerin izin verdiği değişiklikleri kullanarak her zaman herhangi bir sürümden başka bir sürüme en az bir yönde bir yol olmalıdır.
Örneğin, bir Kişi veri sözleşmesinin sürüm 1'i yalnızca Ad veri üyesini içeriyorsa, sözleşmenin yalnızca Yaş üyesini ve yalnızca Adres üyesini ekleyen sürüm 2b'yi eklememelisiniz. 2a'dan 2b'ye geçmek için Yaş'ın kaldırılması ve Adres eklenmesi gerekeceğinden; Diğer yöne gitmek için Adres'in kaldırılması ve Yaş eklenmesi gerekir. Üyelerin kaldırılmasına bu yönergeler tarafından izin verilmez.
Genellikle uygulamanızın yeni bir sürümünde mevcut veri sözleşmesi türlerinin yeni alt türlerini oluşturmamalısınız. Benzer şekilde, Nesne olarak veya arabirim türleri olarak bildirilen veri üyeleri yerine kullanılan yeni veri sözleşmeleri oluşturmamalısınız. Bu yeni sınıfların oluşturulmasına yalnızca yeni türleri eski uygulamanızın tüm örneklerinin bilinen türler listesine ekleyebileceğinizi bildiğiniz durumlarda izin verilir. Örneğin, uygulamanızın 1. sürümünde Kitap ve Gazete veri sözleşmesi alt türlerine sahip LibraryItem veri sözleşmesi türüne sahip olabilirsiniz. LibraryItem daha sonra Kitap ve Gazete içeren bilinen bir tür listesine sahip olur. Şimdi LibraryItem'in alt türü olan sürüm 2'de bir Dergi türü eklediğinizi varsayalım. Sürüm 2'den sürüm 1'e bir Magazine örneği gönderirseniz, Magazine veri sözleşmesi bilinen türler listesinde bulunmaz ve bir özel durum oluşturulur.
Sürümler arasında numaralandırma üyeleri eklememeli veya kaldırmamalısınız. Ayrıca, adlarını veri sözleşmesi modelinde aynı tutmak için öznitelikteki
EnumMemberAttribute
Name özelliğini kullanmadığınız sürece numaralandırma üyelerini yeniden adlandırmamalısınız.Koleksiyonlar, Veri Sözleşmelerindeki Koleksiyon Türleri bölümünde açıklandığı gibi veri sözleşmesi modelinde değiştirilebilir. Bu, büyük ölçüde esneklik sağlar. Ancak, koleksiyon türünü yanlışlıkla sürümden sürüme değiştirilemeyen bir şekilde değiştirmediğinizden emin olun. Örneğin, özelleştirilmemiş bir koleksiyondan (öznitelik olmadan
CollectionDataContractAttribute
) özelleştirilmiş koleksiyona veya özelleştirilmiş koleksiyona, özelleştirilmemiş koleksiyona değiştirmeyin. Ayrıca, sürümündeki özellikleri sürümden sürüme değiştirmeyinCollectionDataContractAttribute
. Temel koleksiyon türünün adı veya ad alanı değiştiyse ve veri sözleşmesi adını ve ad alanını önceki sürümdekiyle aynı yapmanız gerekiyorsa, izin verilen tek değişiklik Bir Ad veya Ad Alanı özelliği eklemektir.
Burada listelenen bazı yönergeler, özel koşullar uygulandığında güvenle yoksayılabilir. Yönergelerden sapmadan önce serileştirme, seri durumdan çıkarma ve şema mekanizmalarını tam olarak anladığınızdan emin olun.
Ayrıca bkz.
- Name
- DataContractAttribute
- Order
- IsRequired
- IExtensibleDataObject
- ServiceBehaviorAttribute
- ExtensionData
- ExtensionDataObject
- OnDeserializingAttribute
- Veri Anlaşmalarını Kullanma
- Veri Anlaşması Sürümü Oluşturma
- Veri Anlaşması Adları
- İleri Uyumlu Veri Anlaşmaları
- Sürüm Toleranslı Seri Hale Getirme Geri Çağrıları