Share via


Veri Sözleşmesi Yedekleri

Veri sözleşmesi vekili , Veri Sözleşmesi modeli üzerine oluşturulmuş gelişmiş bir özelliktir. Bu özellik, kullanıcıların bir türün seri hale getirilme, seri durumdan çıkarma veya meta veriye yansıtılma şeklini değiştirmek istediği durumlarda tür özelleştirme ve değiştirme için kullanılacak şekilde tasarlanmıştır. Bir vekilin kullanılabilmesi için bazı senaryolar, tür için bir veri sözleşmesi belirtilmediğinde, alanlar ve özellikler özniteliğiyle DataMemberAttribute işaretlenmediğinde veya kullanıcıların dinamik olarak şema varyasyonları oluşturmak istemeleridir.

Serileştirme ve seri durumdan çıkarma, .NET Framework'ten XML gibi uygun bir biçime dönüştürmek için kullanılırken DataContractSerializer veri sözleşmesi vekiliyle gerçekleştirilir. Veri sözleşmesi vekili, XML Şema Belgeleri (XSD) gibi meta veri gösterimleri oluştururken türler için dışarı aktarılan meta verileri değiştirmek için de kullanılabilir. İçeri aktarıldıktan sonra, meta verilerden kod oluşturulur ve bu durumda oluşturulan kodu özelleştirmek için vekil de kullanılabilir.

Vekil Nasıl Çalışır?

Vekil, bir türü ("özgün" tür) başka bir türe ("yedekli" tür) eşleyerek çalışır. Aşağıdaki örnekte özgün tür Inventory ve yeni bir vekil InventorySurrogated tür gösterilmektedir. Türü Inventory serileştirilebilir değil, ancak InventorySurrogated türü:

public class Inventory
{
    public int pencils;
    public int pens;
    public int paper;
}

Bu sınıf için bir veri sözleşmesi tanımlanmadığından, sınıfı bir veri sözleşmesi ile vekil sınıfa dönüştürün. Yedekli sınıf aşağıdaki örnekte gösterilmiştir:

[DataContract(Name = "Inventory")]
public class InventorySurrogated
{
    [DataMember]
    public int numpencils;
    [DataMember]
    public int numpaper;
    [DataMember]
    private int numpens;

    public int pens
    {
        get { return numpens; }
        set { numpens = value; }
    }
}

IDataContractSurrogate Uygulama

Veri sözleşmesi vekilini kullanmak için arabirimini IDataContractSurrogate uygulayın.

Aşağıda, olası bir uygulama ile her yöntemine IDataContractSurrogate genel bir bakış sağlanır.

GetDataContractType

yöntemi bir GetDataContractType türü başka bir türle eşler. Serileştirme, seri durumdan çıkarma, içeri ve dışarı aktarma için bu yöntem gereklidir.

İlk görev, hangi türlerin diğer türlere eşleneceklerini tanımlamaktır. Örneğin:

public Type GetDataContractType(Type type)
{
    Console.WriteLine("GetDataContractType");
    if (typeof(Inventory).IsAssignableFrom(type))
    {
        return typeof(InventorySurrogated);
    }
    return type;
}
  • Serileştirmede, bu yöntem tarafından döndürülen eşleme daha sonra yöntemi çağrılarak GetObjectToSerialize özgün örneği yedekli bir örneğe dönüştürmek için kullanılır.

  • Seri durumdan çıkarmada, bu yöntem tarafından döndürülen eşleme, seri hale getirici tarafından vekil türün bir örneğine seri durumdan çıkarmak için kullanılır. Ardından yedeklenen örneği özgün türün bir örneğine dönüştürmek için çağırır GetDeserializedObject .

  • Dışarı aktarmada, bu yöntem tarafından döndürülen vekil türü, meta veri oluşturmak için kullanılacak veri sözleşmesini almak için yansıtılır.

  • İçeri aktarma işleminde, ilk tür, veri sözleşmesinin desteğe başvurma gibi amaçlarla kullanılmasını sağlamak için yansıtılan bir vekil türe değiştirilir.

Type parametresi seri hale getirilen, seri durumdan çıkarılan, içeri veya dışarı aktarılan nesnenin türüdür. GetDataContractType Vekil türü işlemezse yöntemi giriş türünü döndürmelidir. Aksi takdirde uygun yedekli türü döndürebilirsiniz. Birkaç vekil tür varsa, bu yöntemde çok sayıda eşleme tanımlanabilir.

GetDataContractType yöntemi, veya Stringgibi Int32 yerleşik veri sözleşmesi temel bilgileri için çağrılmaz. Diziler, kullanıcı tanımlı türler ve diğer veri yapıları gibi diğer türler için bu yöntem her tür için çağrılır.

Önceki örnekte yöntemi, parametresinin type ve Inventory karşılaştırılabilir olup olmadığını denetler. Bu durumda yöntemi ile eşler InventorySurrogated. Serileştirme, seri durumdan çıkarma, şemayı içeri aktarma veya dışarı aktarma şeması çağrıldığında, türler arasındaki eşlemeyi belirlemek için önce bu işlev çağrılır.

GetObjectToSerialize Yöntemi

yöntemi, GetObjectToSerialize özgün tür örneğini yedekli tür örneğine dönüştürür. yöntemi serileştirme için gereklidir.

Sonraki adım, yöntemini uygulayarak GetObjectToSerialize fiziksel verilerin özgün örnekten vekile nasıl eşleneceğini tanımlamaktır. Örneğin:

public object GetObjectToSerialize(object obj, Type targetType)
{
    Console.WriteLine("GetObjectToSerialize");
    if (obj is Inventory)
    {
        InventorySurrogated isur = new InventorySurrogated();
        isur.numpaper = ((Inventory)obj).paper;
        isur.numpencils = ((Inventory)obj).pencils;
        isur.pens = ((Inventory)obj).pens;
        return isur;
    }
    return obj;
}

GetObjectToSerialize Bir nesne seri hale getirildiğinde yöntemi çağrılır. Bu yöntem, özgün türdeki verileri yedekli türün alanlarına aktarır. Alanlar doğrudan vekil alanlara eşlenebilir veya özgün verilerin işlemeleri vekilde depolanabilir. Bazı olası kullanımlar şunlardır: alanları doğrudan eşleme, yedekli alanlarda depolanacak veriler üzerinde işlemler gerçekleştirme veya yedekli alanda özgün türün XML'sini depolama.

targetType parametresi, üyenin bildirilen türüne başvurur. Bu parametre, yöntemi tarafından GetDataContractType döndürülen yedekli türdür. Seri hale getirici, döndürülen nesnenin bu türe atanabilir olmasını zorlamaz. obj parametresi serileştirilecek nesnedir ve gerekirse vekiline dönüştürülür. Yedeklenen nesne nesne işlemezse bu yöntem giriş nesnesini döndürmelidir. Aksi takdirde, yeni vekil nesne döndürülür. Nesne null ise vekil çağrılmaz. Bu yöntem içinde farklı örnekler için çok sayıda vekil eşleme tanımlanabilir.

oluştururken DataContractSerializernesne başvurularını korumasını sağlayabilirsiniz. (Daha fazla bilgi için bkz. Serileştirme ve Seri Durumdan Çıkarma.) Bu, oluşturucusunda preserveObjectReferences parametresi olarak trueayarlanarak yapılır. Bu durumda, izleyen tüm serileştirmeler yalnızca başvuruyu akışa yazdığından, vekil bir nesne için yalnızca bir kez çağrılır. olarak ayarlanırsa preserveObjectReferencesfalse, bir örnekle her karşılaşıldığında vekil çağrılır.

Seri hale getirilen örneğin türü bildirilen türden farklıysa, örneğin xsi:type diğer uçta seri durumdan çıkarılmasına izin vermek için tür bilgileri akışa yazılır. Bu işlem, nesnenin yedeklenip yedeklenmediği fark etmese de gerçekleşir.

Yukarıdaki örnek, örneğin InventorySurrogatedverilerini Inventory değerine dönüştürür. Nesnenin türünü denetler ve yedekli türe dönüştürmek için gerekli işlemeleri gerçekleştirir. Bu durumda, sınıfın alanları Inventory doğrudan sınıf alanlarına kopyalanır InventorySurrogated .

GetDeserializedObject Yöntemi

GetDeserializedObject yöntemi yedekli tür örneğini özgün tür örneğine dönüştürür. Seri durumdan çıkarma için gereklidir.

Bir sonraki görev, fiziksel verilerin vekil örnekten özgün örneğe nasıl eşleneceklerini tanımlamaktır. Örneğin:

public object GetDeserializedObject(object obj, Type targetType)
{
    Console.WriteLine("GetDeserializedObject");
    if (obj is InventorySurrogated)
    {
        Inventory invent = new Inventory();
        invent.pens = ((InventorySurrogated)obj).pens;
        invent.pencils = ((InventorySurrogated)obj).numpencils;
        invent.paper = ((InventorySurrogated)obj).numpaper;
        return invent;
    }
    return obj;
}

Bu yöntem yalnızca bir nesnenin seri durumdan çıkarılması sırasında çağrılır. Yedek türünden özgün türüne geri seri durumdan çıkarma için ters veri eşlemesi sağlar. Yöntemine GetObjectToSerialize benzer şekilde, bazı olası kullanımlar doğrudan alan verilerini değiştirmek, veriler üzerinde işlemler gerçekleştirmek ve XML verilerini depolamak olabilir. Seri durumdan çıkarırken, veri dönüştürmedeki işlemeler nedeniyle her zaman özgün veri değerlerini tam olarak elde edemeyebilirsiniz.

targetType parametresi, üyenin bildirilen türüne başvurur. Bu parametre, yöntemi tarafından GetDataContractType döndürülen yedekli türdür. obj parametresi, seri durumdan çıkarılmış nesneye başvurur. Nesne yedekliyse özgün türüne geri dönüştürülebilir. Bu yöntem, vekil nesne işlemezse giriş nesnesini döndürür. Aksi takdirde, seri durumdan çıkarılmış nesne dönüştürme tamamlandıktan sonra döndürülür. Birden fazla vekil tür varsa, her biri için her türü ve onun dönüşümünü belirterek vekilden birincil türe veri dönüştürme sağlayabilirsiniz.

Bir nesne döndürülürken, iç nesne tabloları bu vekil tarafından döndürülen nesneyle güncelleştirilir. Bir örneğe yapılan sonraki başvurular, nesne tablolarından yedeklenen örneği alır.

Önceki örnek, türündeki InventorySurrogated nesneleri ilk türüne Inventorydönüştürür. Bu durumda veriler doğrudan içindeki ilgili alanlarına Inventorygeri InventorySurrogated aktarılır. Veri işlemeleri olmadığından, üye alanlarının her biri serileştirmeden önceki değerlerle aynı değerleri içerir.

GetCustomDataToExport Yöntemi

Şema GetCustomDataToExport dışarı aktarılırken yöntemi isteğe bağlıdır. Dışarı aktarılan şemaya ek veri veya ipuçları eklemek için kullanılır. Üye düzeyinde veya tür düzeyinde ek veriler eklenebilir. Örneğin:

public object GetCustomDataToExport(System.Reflection.MemberInfo memberInfo, Type dataContractType)
{
    Console.WriteLine("GetCustomDataToExport(Member)");
    System.Reflection.FieldInfo fieldInfo = (System.Reflection.FieldInfo)memberInfo;
    if (fieldInfo.IsPublic)
    {
        return "public";
    }
    else
    {
        return "private";
    }
}

Bu yöntem (iki aşırı yükleme ile), üye veya tür düzeyinde meta veriye ek bilgi eklenmesini sağlar. Bir üyenin genel mi yoksa özel mi olduğu hakkında ipuçları ve şemanın dışarı ve içeri aktarılması boyunca korunacak açıklamalar eklemek mümkündür. Bu tür bilgiler bu yöntem olmadan kaybolur. Bu yöntem üyelerin veya türlerin eklenmesine veya silinmesine neden olmaz, bunun yerine bu düzeylerden herhangi birinde şemalara ek veriler ekler.

yöntemi aşırı yüklenmiştir ve bir Type (clrtype parametresi) veya MemberInfo (memberInfo parametresi alabilir). İkinci parametre her zaman bir Type (dataContractType parametresidir). Bu yöntem, yedekli türün her üyesi ve türü için çağrılır dataContractType .

Bu aşırı yüklemelerden biri ya da null serileştirilebilir bir nesne döndürmelidir. Null olmayan bir nesne, dışarı aktarılan şemada ek açıklama olarak seri hale getirilir. Type Aşırı yükleme için, şemaya dışarı aktarılan her tür, parametre olarak yedekli türle birlikte ilk parametrede bu yönteme dataContractType gönderilir. MemberInfo Aşırı yükleme için, şemaya dışarı aktarılan her üye, bilgilerini ikinci parametrede yedekli türe sahip parametre olarak memberInfo gönderir.

GetCustomDataToExport Yöntemi (Tür, Tür)

yöntemi IDataContractSurrogate.GetCustomDataToExport(Type, Type) , her tür tanımı için şema dışarı aktarma sırasında çağrılır. yöntemi, dışarı aktarırken şema içindeki türlere bilgi ekler. Tanımlanan her tür, şemaya eklenmesi gereken ek veriler olup olmadığını belirlemek için bu yönteme gönderilir.

GetCustomDataToExport Yöntemi (MemberInfo, Tür)

IDataContractSurrogate.GetCustomDataToExport(MemberInfo, Type), dışarı aktarılan türlerdeki her üye için dışarı aktarma sırasında çağrılır. Bu işlev, dışarı aktarma sırasında şemaya dahil edilecek üyeler için açıklamaları özelleştirmenizi sağlar. Sınıfındaki her üyenin bilgileri, şemaya ek veri eklenmesi gerekip gerekmediğini denetlemek için bu yönteme gönderilir.

Yukarıdaki dataContractType örnek, vekilin her üyesi için öğesini arar. Ardından her alan için uygun erişim değiştiriciyi döndürür. Bu özelleştirme olmadan, erişim değiştiricileri için varsayılan değer geneldir. Bu nedenle, gerçek erişim kısıtlamaları ne olursa olsun, dışarı aktarılan şema kullanılarak oluşturulan kodda tüm üyeler genel olarak tanımlanabilir. Bu uygulamayı kullanmadığınızda, vekilde özel olarak tanımlansa bile dışarı aktarılan şemada üye numpens genel olur. Bu yöntemin kullanılmasıyla, dışarı aktarılan şemada erişim değiştiricisi özel olarak oluşturulabilir.

GetReferencedTypeOnImport Yöntemi

Bu yöntem, vekilin öğesini özgün türe eşler Type . Bu yöntem şema içeri aktarma için isteğe bağlıdır.

Şemayı içeri aktaran ve bunun için kod oluşturan bir vekil oluştururken, sonraki görev bir vekil örneğin türünü özgün türüne tanımlamaktır.

Oluşturulan kodun mevcut bir kullanıcı türüne başvurması gerekiyorsa, bu yöntem uygulanarak GetReferencedTypeOnImport gerçekleştirilir.

Bir şema içeri aktarılırken, yedekli veri sözleşmesini bir türe eşlemek için her tür bildirimi için bu yöntem çağrılır. Dize parametreleri typeName ve typeNamespace yedekli türün adını ve ad alanını tanımlayın. için dönüş değeri GetReferencedTypeOnImport , yeni bir tür oluşturulması gerekip gerekmediğini belirlemek için kullanılır. Bu yöntem geçerli bir tür veya null döndürmelidir. Geçerli türler için döndürülen tür, oluşturulan kodda başvurulmuş tür olarak kullanılır. Null döndürülürse, hiçbir türe başvurulmayacak ve yeni bir tür oluşturulmalıdır. Birkaç vekil varsa, her vekil tür için eşlemeyi ilk türüne geri gerçekleştirmek mümkündür.

customData parametresi, başlangıçta öğesinden GetCustomDataToExportdöndürülen nesnedir. Bu customData , vekil yazarların kod oluşturmak için içeri aktarma sırasında kullanılacak meta verilere ek veri/ipuçları eklemek istediklerinde kullanılır.

ProcessImportedType Yöntemi

yöntemi, ProcessImportedType şema içeri aktarma işleminden oluşturulan tüm türleri özelleştirir. Bu yöntem isteğe bağlıdır.

Bir şema içeri aktarılırken, bu yöntem içeri aktarılan tür ve derleme bilgilerinin özelleştirilmesine olanak tanır. Örneğin:

public System.CodeDom.CodeTypeDeclaration ProcessImportedType(System.CodeDom.CodeTypeDeclaration typeDeclaration, System.CodeDom.CodeCompileUnit compileUnit)
{
    Console.WriteLine("ProcessImportedType");
    foreach (CodeTypeMember member in typeDeclaration.Members)
    {
        object memberCustomData = member.UserData[typeof(IDataContractSurrogate)];
        if (memberCustomData != null
          && memberCustomData is string
          && ((string)memberCustomData == "private"))
        {
            member.Attributes = ((member.Attributes & ~MemberAttributes.AccessMask) | MemberAttributes.Private);
        }
    }
    return typeDeclaration;
}

İçeri aktarma sırasında, oluşturulan her tür için bu yöntem çağrılır. Belirtilen CodeTypeDeclaration değerini değiştirin veya değerini CodeCompileUnitdeğiştirin. Bu, adını, üyelerini, özniteliklerini ve diğer birçok özelliğini CodeTypeDeclarationdeğiştirmeyi içerir. ile işlem CodeCompileUnityaparak yönergelerini, ad alanlarını, başvuruda bulunan derlemeleri ve diğer birçok yönü değiştirebilirsiniz.

CodeTypeDeclaration parametresi dom türü bildirimini içerir. parametresi, CodeCompileUnit kodu işlemek için değişiklik yapılmasını sağlar. Tür bildiriminin atılmasıyla sonuç döndürülüyor null . Buna karşılık, bir CodeTypeDeclarationdöndürürken değişiklikler korunur.

Meta verileri dışarı aktarma sırasında özel veriler eklenirse, kullanılabilmesi için içeri aktarma sırasında kullanıcıya sağlanması gerekir. Bu özel veriler, programlama modeli ipuçları veya diğer açıklamalar için kullanılabilir. Her CodeTypeDeclaration ve CodeTypeMember örnek, türüne UserData göre özel IDataContractSurrogate verileri özelliği olarak içerir.

Yukarıdaki örnek, içeri aktarılan şemada bazı değişiklikler gerçekleştirir. Kod, bir vekil kullanarak özgün türün özel üyelerini korur. Şema içeri aktarılırken varsayılan erişim değiştiricisi şeklindedir public. Bu nedenle, bu örnekte olduğu gibi, vekil şemanın tüm üyeleri değiştirilmediği sürece genel olacaktır. Dışarı aktarma sırasında, özel veriler hangi üyelerin özel olduğu meta verilere eklenir. Örnek özel verileri arar, erişim değiştiricinin özel olup olmadığını denetler ve ardından özniteliklerini ayarlayarak uygun üyeyi özel olacak şekilde değiştirir. Bu özelleştirme olmadan üye özel numpens yerine genel olarak tanımlanır.

GetKnownCustomDataTypes Yöntemi

Bu yöntem şemadan tanımlanan özel veri türlerini alır. yöntemi şema içeri aktarma için isteğe bağlıdır.

yöntemi şema dışarı ve içeri aktarma işleminin başında çağrılır. yöntemi, dışarı veya içeri aktarılan şemada kullanılan özel veri türlerini döndürür. yöntemi, bir tür koleksiyonu olan bir Collection<T> ( customDataTypes parametresi) geçirilir. yöntemi, bu koleksiyona bilinen başka türler eklemelidir. kullanarak özel verilerin seri hale getirilmesini ve seri durumdan çıkarılabilmesi için bilinen özel veri DataContractSerializertürleri gereklidir. Daha fazla bilgi için bkz . Veri Sözleşmesi Bilinen Türleri.

Vekil Uygulama

WCF'de veri sözleşmesi vekilini kullanmak için birkaç özel yordamı izlemeniz gerekir.

Serileştirme ve Seri Durumdan Çıkarma için Vekil Kullanma

vekili DataContractSerializer ile verilerin seri hale getirilmesini ve seri durumdan çıkarılması işlemini gerçekleştirmek için kullanın. DataContractSerializer tarafından oluşturulurDataContractSerializerOperationBehavior. Vekil de belirtilmelidir.

Serileştirme ve seri durumdan çıkarma uygulamak için
  1. Hizmetiniz için öğesinin ServiceHost bir örneğini oluşturun. Tam yönergeler için bkz . Temel WCF Programlama.

  2. Belirtilen hizmet ana bilgisayarlarının her ServiceEndpoint biri için öğesini OperationDescriptionbulun.

  3. bir örneğinin DataContractSerializerOperationBehavior bulunup bulunmadığını belirlemek için işlem davranışlarını arayın.

  4. DataContractSerializerOperationBehavior bulunursa, özelliğini vekilin yeni bir örneği olarak ayarlayınDataContractSurrogate. Bulunamazsa DataContractSerializerOperationBehavior yeni bir örnek oluşturun ve yeni davranışın üyesini vekilin yeni bir örneği olarak ayarlayın DataContractSurrogate .

  5. Son olarak, aşağıdaki örnekte gösterildiği gibi bu yeni davranışı geçerli işlem davranışlarına ekleyin:

    using (ServiceHost serviceHost = new ServiceHost(typeof(InventoryCheck)))
        foreach (ServiceEndpoint ep in serviceHost.Description.Endpoints)
        {
            foreach (OperationDescription op in ep.Contract.Operations)
            {
                DataContractSerializerOperationBehavior dataContractBehavior =
                    op.Behaviors.Find<DataContractSerializerOperationBehavior>()
                    as DataContractSerializerOperationBehavior;
                if (dataContractBehavior != null)
                {
                    dataContractBehavior.DataContractSurrogate = new InventorySurrogated();
                }
                else
                {
                    dataContractBehavior = new DataContractSerializerOperationBehavior(op);
                    dataContractBehavior.DataContractSurrogate = new InventorySurrogated();
                    op.Behaviors.Add(dataContractBehavior);
                }
            }
        }
    

Meta Veri İçeri Aktarma için Vekil Kullanma

İstemci tarafı kodu oluşturmak için WSDL ve XSD gibi meta verileri içeri aktarırken, vekilin XSD şemasından XsdDataContractImporterkod oluşturmaktan sorumlu bileşene eklenmesi gerekir. Bunu yapmak için, meta verileri içeri aktarmak için kullanılan öğesini WsdlImporter doğrudan değiştirin.

Meta veri içeri aktarma için vekil uygulama
  1. sınıfını kullanarak meta verileri içeri aktarın WsdlImporter .

  2. öğesinin tanımlanıp tanımlanmadığını TryGetValueXsdDataContractImporter denetlemek için yöntemini kullanın.

  3. TryGetValue yöntemi döndürürsefalse, yeni XsdDataContractImporter bir oluşturun ve özelliğini Options sınıfının yeni bir örneğine ImportOptions ayarlayın. Aksi takdirde, yönteminin parametresi tarafından out döndürülen içeri aktarıcıyı TryGetValue kullanın.

  4. XsdDataContractImporter tanımlı değilseImportOptions, özelliğini sınıfın yeni bir örneği ImportOptions olarak ayarlayın.

  5. DataContractSurrogate öğesinin ImportOptionsXsdDataContractImporter özelliğini vekilin yeni bir örneğine ayarlayın.

  6. XsdDataContractImporter özelliğinin WsdlImporter (sınıfından devralınır) tarafından State döndürülen koleksiyonuna MetadataExporter ekleyin.

  7. şema içindeki ImportAllContracts tüm veri sözleşmelerini içeri aktarmak için yöntemini WsdlImporter kullanın. Son adım sırasında, vekile çağrılarak yüklenen şemalardan kod oluşturulur.

    MetadataExchangeClient mexClient = new MetadataExchangeClient(metadataAddress);
    mexClient.ResolveMetadataReferences = true;
    MetadataSet metaDocs = mexClient.GetMetadata();
    WsdlImporter importer = new WsdlImporter(metaDocs);
    object dataContractImporter;
    XsdDataContractImporter xsdInventoryImporter;
    if (!importer.State.TryGetValue(typeof(XsdDataContractImporter),
        out dataContractImporter))
        xsdInventoryImporter = new XsdDataContractImporter();
    
    xsdInventoryImporter = (XsdDataContractImporter)dataContractImporter;
    xsdInventoryImporter.Options ??= new ImportOptions();
    xsdInventoryImporter.Options.DataContractSurrogate = new InventorySurrogated();
    importer.State.Add(typeof(XsdDataContractImporter), xsdInventoryImporter);
    
    Collection<ContractDescription> contracts = importer.ImportAllContracts();
    

Meta Veri Dışarı Aktarma için vekil kullanmak için

Varsayılan olarak, bir hizmet için WCF'den meta verileri dışarı aktarırken hem WSDL hem de XSD şemasının oluşturulması gerekir. Vekilin, veri sözleşmesi türleri için XSD şeması oluşturmakla sorumlu bileşene XsdDataContractExportereklenmesi gerekir. Bunu yapmak için, öğesini değiştirmek WsdlExporteriçin uygulayan IWsdlExportExtension bir davranış kullanın veya meta verileri dışarı aktarmak için kullanılan öğesini WsdlExporter doğrudan değiştirin.

Meta veri dışarı aktarma için vekil kullanmak için
  1. Yeni WsdlExporter bir oluşturun veya yöntemine wsdlExporter geçirilen parametresini ExportContract kullanın.

  2. bir tanımlanıp tanımlanmadığını TryGetValueXsdDataContractExporter denetlemek için işlevini kullanın.

  3. döndürürsefalseTryGetValue, öğesinden WsdlExporteroluşturulan XML şemalarıyla yeni XsdDataContractExporter bir oluşturun ve özelliğinin State döndürdüğü koleksiyona WsdlExporterekleyin. Aksi takdirde, yönteminin out parametresi tarafından döndürülen vereni TryGetValue kullanın.

  4. XsdDataContractExporter tanımlı değilseExportOptions, özelliğini sınıfın Options yeni bir örneğine ExportOptions ayarlayın.

  5. DataContractSurrogate öğesinin ExportOptionsXsdDataContractExporter özelliğini vekilin yeni bir örneğine ayarlayın. Meta verileri dışarı aktarmak için sonraki adımlar herhangi bir değişiklik gerektirmez.

    WsdlExporter exporter = new WsdlExporter();
    //or
    //public void ExportContract(WsdlExporter exporter,
    // WsdlContractConversionContext context) { ... }
    object dataContractExporter;
    XsdDataContractExporter xsdInventoryExporter;
    if (!exporter.State.TryGetValue(typeof(XsdDataContractExporter),
        out dataContractExporter))
    {
        xsdInventoryExporter = new XsdDataContractExporter(exporter.GeneratedXmlSchemas);
    }
    else
    {
        xsdInventoryExporter = (XsdDataContractExporter)dataContractExporter;
    }
    
    exporter.State.Add(typeof(XsdDataContractExporter), xsdInventoryExporter);
    
    if (xsdInventoryExporter.Options == null)
        xsdInventoryExporter.Options = new ExportOptions();
    xsdInventoryExporter.Options.DataContractSurrogate = new InventorySurrogated();
    

Ayrıca bkz.