2008-11-21 14 views
19

Eksperymentuję z usługami WCF i napotkałem problem z przekazywaniem interfejsów.Przekazywanie interfejsu w usłudze WCF?

to działa:

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

ale to nie:

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

Kiedy próbuję skompilować klienta nie powiedzie się na metodzie GetInterface. Dostaję wyjątek z informacją, że nie można przekształcić Object w IDevice.

Na kliencie klasa IHomeService poprawnie implementuje GetString z ciągiem znaków jako returntypem, ale GetInterface ma typ obiektu. Dlaczego nie jest to IDevice?

Odpowiedz

20

Trzeba powiedzieć serializatora której klasy WCF używać do serializacji jest przez urządzenie

[ServiceKnownType(typeof(ConcreteDeviceType)] 
+1

Przykro mi, ale nie sądzę, że rozumiem. Załóżmy, że chcę, aby metoda GetInterface zwróciła dwie różne klasy: SimpleDevice i AdvancedDevice, obie implementujące interfejs IDevice. Czy powinienem ustawić ServiceKnownType dla obu typów? –

+1

Podczas deserializacji, w jaki sposób WCF wie, jakiego typu implementacja IHomeService ma być używana? – Will

+1

Tak, myślę, że to dostałeś. Mówisz WCF o możliwych typach implementujących interfejs. Możesz przejść przez dowolny typ, tak długo, jak WCF wie, że te znane typy implementują interfejs i są serializowane. –

9

Dzięki, to działa, kiedy zmienił go tak:

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

Dostałam też pomoc ta site: http://www.thoughtshapes.com/WCF/UsingInterfacesAsParameters.htm

+0

Dzięki za ten przykład! –

+1

Link jest teraz 404, ale niektóre wyszukiwarki mają go w pamięci podręcznej – noonand

+0

Frode: Nie sądzisz, że @Brian rzeczywiście odpowiedział na twoje pytanie? –

1

Początkowo próbowałem przekazać interfejs do metody WCF, ale nie udało mi się uruchomić kodu przy użyciu odpowiedzi podanych w tym wątku. W końcu refaktoryzowałem swój kod i przekazałem klasę abstrakcyjną do metody zamiast interfejsu. Mam to do pracy przy użyciu atrybutu KnownType w klasie bazowej np.

[DataContract] 
[KnownType(typeof(LoadTypeData))] 
[KnownType(typeof(PlanReviewStatusData))] 
public abstract class RefEntityData : EntityData, IRefEntityData 
Powiązane problemy