2008-11-21 17 views
19

WCF Services ile deneme yapıyorum ve Arayüzleri geçme ile ilgili bir problemle karşılaştım.Arabirimi bir WCF Hizmetinde Geçirme?

[ServiceContract] 
public interface IHomeService 
{ 
    [OperationContract] 
    string GetString(); 
} 

ama bu değil:

Bu işleri

[ServiceContract] 
public interface IHomeService 
{ 
    [OperationContract] 
    IDevice GetInterface(); 
} 

Ben GetInterface yöntemine başarısız istemci derlemeye deneyin

. Object'i IDevice'e dönüştüremediğini söyleyen bir Özel Durum alıyorum.

İstemci tarafında, IHomeService sınıfı, GetString öğesini döndürdüğü gibi bir dize ile doğru şekilde uygular, ancak GetInterface nesnesinin bir tür döndürme nesnesine sahiptir. Neden kimlik değil? Ben böyle değişti

cevap

20

Arayüze

[ServiceKnownType(typeof(ConcreteDeviceType)] 
+1

Üzgünüm, ama anladığımı sanmıyorum. GetInterface yönteminin IDevice arabirimini uygulayan iki farklı sınıf olan SimpleDevice ve AdvancedDevice'i döndürmesini istiyorum. ServiceKnownType'ı her iki tür için de ayarlamalı mıyım? –

+1

Seri hale getirme sırasında, WCF hangi IHomeService türünün kullanıldığını biliyor mu? – Will

+1

Evet, sanırım anladın. WCF'ye arayüzü uygulayan olası türleri söylüyorsunuz. WCF, bilinen bu türlerin arabirimi uyguladığı ve serileştirilebildiğini bildiği sürece, her türünü iletebilirsiniz. –

9

Teşekkür seri hale getirmek için kullanılacak sınıf WCF seri hale anlatmak gerekir çalışır:

[ServiceContract] 
[ServiceKnownType(typeof(PhotoCamera))] 
[ServiceKnownType(typeof(TemperatureSensor))] 
[ServiceKnownType(typeof(DeviceBase))] 
public interface IHomeService 
{ 
    [OperationContract] 
    IDevice GetInterface(); 
} 

Ben de bu yardım aldı site: http://www.thoughtshapes.com/WCF/UsingInterfacesAsParameters.htm

+0

Bu örnek için teşekkürler! –

+1

Link şimdi 404'tür, ancak bazı arama motorları önbelleğe aldırdı – noonand

+0

Frode: Bu soruya @Brian'ın gerçekten cevap verdiğini düşünmüyor musunuz? –

1

İlk olarak bir WCF yöntemine bir arabirim iletmeyi denedim, ancak bu iş parçacığı üzerinde sağlanan yanıtları kullanarak çalışacak kodu alamadım. Sonunda kodumu yeniden düzenledim ve bir arabirim yerine, yönteme bir soyut sınıf geçtim. Bunu, temel sınıftaki KnownType özniteliğini kullanarak çalıştım.

[DataContract] 
[KnownType(typeof(LoadTypeData))] 
[KnownType(typeof(PlanReviewStatusData))] 
public abstract class RefEntityData : EntityData, IRefEntityData 
İlgili konular