SORU
21 NİSAN 2009, Salı


Nasıl XML bilinen türleri Program aracılığıyla yapılandırma mı?

İstemci/sunucu uygulaması harika olan iletişimi için XML kullanıyor. Ancak mevcut mimari bir eksiklik bulaşan bazı türleri için bilinen tür yapılandırma kullanmalısınız. In-house Pub/Sub mekanizması kullanıyorum ve bu gereksinimi kaçınılmazdır.

Sorun kolay bilinen türü eklemek için unutmak, ve eğer bunu yaparsanız, XML yanlış giden şeyin ne kadar az ipucu ile sessizce başarısız olur.

Benim uygulamada, gönderilen olacak türlerinin biliyorum. Yapılandırma programlı olarak gerçekleştirmek için, şu anda böyle bir şey içerir: App.config dosyası hazırlanmasına yerine istiyorum

<system.runtime.serialization>
  <dataContractSerializer>
    <declaredTypes>
      <add type="MyProject.MyParent, MyProjectAssembly">
        <knownType type="MyProject.MyChild1, MyProjectAssembly"/>
        <knownType type="MyProject.MyChild2, MyProjectAssembly"/>
        <knownType type="MyProject.MyChild3, MyProjectAssembly"/>
        <knownType type="MyProject.MyChild4, MyProjectAssembly"/>
        <knownType type="MyProject.MyChild5, MyProjectAssembly"/>
      </add>
    </declaredTypes>
  </dataContractSerializer>
</system.runtime.serialization>

Bunun yerine, şöyle bir şey yapmak istiyorum:

foreach (Type type in _transmittedTypes)
{
    // How would I write this method?
    AddKnownType(typeof(MyParent), type);
}

Birisi bunu nasıl açıklayabilir?

EDİTLütfen bilinen türleri dinamik olarak çalışma zamanında yerine kaynak kodu config veya kullanarak öznitelikleri bildirimli olarak çalışıyorum anlıyorum.

Bu temelde XML API, tarzı bir soru değil bir soru.

2 DÜZENLEYİNThis MSDN page sayfa durumları:

Ayrıca ReadOnlyCollection, DataContractSerializer bu KnownTypes özelliği üzerinden erişilen türleri ekleyebilirsiniz.

Ne yazık ki bu kadar yazıyor ve KnownTypes salt okunur bir özellik olduğu göz önüne alındığında çok fazla anlam ifade etmiyor, ve bu özelliğin değeri ReadOnlyCollection.

CEVAP
21 NİSAN 2009, Salı


[ServiceContract] arayüzü [ServiceKnownType] ekleyin:

[ServiceKnownType("GetKnownTypes", typeof(KnownTypesProvider))]

sonra bir sınıf KnownTypesProvider oluşturun:

internal static class KnownTypesProvider
{
    public static IEnumerable<Type> GetKnownTypes(ICustomAttributeProvider provider)
    {
         // collect and pass back the list of known types
    }
}

ve sonra ne gerekiyorsa arkaya verin.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • arnejann

    arnejann

    3 Kasım 2007
  • HSmasteryoda .

    HSmasteryoda

    22 Ocak 2010
  • infiniTuts

    infiniTuts

    18 Ocak 2012