WCF e interfacce sui contratti di dati

Durante la creazione del proxy WCF tramite svcutil, è ansible includere anche le interfacce da cui i contratti di dati ereditano, ad esempio:

public class SomeType: ISometype { public string Name { get; set; } } public interface ISometype { public string Name { get; set; } } 

Quando creo il proxy usando questo, il tipo SomeType viene creato sul client, ma l’interfaccia non viene creata e non c’è nemmeno l’ereditarietà. Ho provato a contrassegnare l’interfaccia come DataContract ma quell’attributo non è consentito.

È ansible fare ciò che sto cercando di fare?

WCF utilizza la messaggistica serializzata e tutti questi messaggi devono poter essere serializzati utilizzando un DataContractSerializer o un XmlSerializer. E quei messaggi che vanno tra il client e il server devono essere espressi nello schema XML.

Ora, lo schema XML non sa nulla delle interfacce: si tratta di tipi concreti e reali. Per uno scenario normale in cui i client possono essere qualsiasi cosa, da .NET a PHP a Ruby (qualunque cosa), è necessario assicurarsi di esprimere tutto ciò che si desidera inviare tra client e server in un modo che possa essere rappresentato nello schema XML – interfacce non può. Quindi non c’è davvero modo di supportarlo in uno scenario generale.

Se stai controllando entrambe le estremità del filo, ad esempio scrivi sia il client che il server, ed entrambi in .NET, puoi farlo:

  • inserisci i tuoi DataContracts (e i tuoi ServiceContracts e OperationContracts e FaultContracts) in un assembly MyServiceContracts separato

  • fare riferimento all’assieme sia dal codice sul lato del servizio che dal client. In tal caso, quando si procede alla creazione del proxy client, i tipi che si menzionano sono già presenti e WCF riutilizzerà felicemente quei tipi da quell’assembly. E dal momento che si tratta di un assembly .NET a cui si fa riferimento, è ansible avere tutto ciò che .NET supporta, comprese le interfacce.

È ansible ereditare dalla class l’implementazione di ISometype e aggiungerlo alla serializzazione utilizzando l’attributo KnownType:

Posso forzare svcutil.exe per generare contratti dati per un servizio WCF?