2010-12-10 21 views
0

Ich versuche, meinen Weg durch WCF Puzzle und in meiner Beispiel-App die Voraussetzung ist es, eine Klasse zwischen meiner Website und meinem neuen WCF-Dienst.WCF übergeben komplexen Typ ohne gemeinsame Typen dll

Ich habe keine gemeinsame dll-Typen so wie gebe ich mein Objekt durch den Dienst?

Mein Code sieht ungefähr so ​​aus;

Webseite

namespace HRO_Proof

{

[DataContract(Name = "ThrowAway", Namespace = "http://schemas.proof.com/throwaway/")] 
[KnownType(typeof(ThrowAway))] 
public class ThrowAway 
{ 
    public Int32 MyValue { get; set; } 

    public Boolean SomeFunc() 
    { 
     return true; 
    } 
} 

}

WCF-Dienst

namespace HRO_ServiceLibarary

{

public class StateService : IStateService 
{ 
    public Int32 SaveThrowaway(object throwAway) 
    { 
     //Save to DB 
     return 0; //Id of inserted record 
    } 

} 

}

ich ein wenig über einen DataContractResolver gelesen habe, aber ich bin mir nicht sicher, wie ich das umsetzen kann.

Jede Hilfe der Richtung wäre willkommen.

Danke, Mike

Antwort

0

In der Klasse Zeichen jedes Mitglied mit Datamember. Funktionen können nicht als DataMember markiert werden.

[DataContract] 
public class ThrowAway 
{ 
    [DataMember] 
    public Int32 MyValue { get; set; } 
} 

In Service

public class StateService : IStateService 
{ 
    public Int32 SaveThrowaway(ThrowAway throwAway) 
    { 
     //Save to DB 
     return 0; //Id of inserted record 
    } 

} 

Nun, wenn Sie diesen Service in Ihre Website Dienst hinzufügen Referenz verwenden möchten, und Sie sollten die Klasse Throwaway in der Proxy-Klasse

0

1) [KnownType(typeof(ThrowAway))] erhalten: Knowntype Attribut mit dem gleichen Typ wie die Klasse selbst ist nutzlos und implizit erzwungen. Du brauchst es nicht.

2) Parametertyp des Objekts muss fast nie aus verschiedenen Gründen verwendet werden. In der Tat benötigen Sie einen [KnownType (typeof (ThrowAway))] auf der object Klasse, aber offensichtlich besitzen Sie diese Klasse nicht. Also besorge dir eine bessere Abstraktion.

3) Wie Dinesh sagte, benötigen Sie [DataMember] über die public Int32 MyValue { get; set; }.

4) Wenn Sie die Codegenerierung verwenden, indem Sie eine Servicereferenz hinzufügen, bleiben Ihre Methoden auf dem Server und werden nicht verlassen. Aber wenn Sie Ihre Entitäten (ThrowAway) an Ihren Kunden verteilen, dann werden sie es tun und es ist eine gute Übung. Merken! Trennen Sie die Schnittstelle, die Entitäten und die Implementierung jeweils in eine separate DLL.