Vra

Ek het 'n BWF diens aangebied in IIS. Die bedoeling is om kliënte om 'n oproep te maak en kry 'n persoonlike klas wat gedefinieer word in 'n ander projek / dll. Ek het 'n diens kliënt met behulp van die svcutil.exe gegenereer. Die probleem is dit gegenereerde auto kliënt bevat 'n nuwe gedeeltelike / proxy definisie vir die klas ek probeer om terug te keer uit die diens. Dit gooi nou 'n sukses fout tussen my oorspronklike persoonlike klas en die nuwe gedeeltelike definisie tydens kompilering. So hoe kan jy terugkeer gebruiker gedefinieerde tipes van 'n BWF diens? Advies sal waardeer word.

Was dit nuttig?

Oplossing

Net om tweede Yossi se / ryk se gedagtes:

  • Ja, jy kan 'n verwysing by te voeg tot die gedeelde dll (eerder as die gebruik van die gegenereerde proxy klas)
  • Ja, dit klop 'n groot deel van die opset van data-kontrakte, en indien enige soort van persoonlike serialisasie gebeur, kan jy probleme uit te brei jou diens het

Ek het langs die pad voor gegaan, en in sommige maniere wens ek het nie. Re rekbaarheid / persoonlike serialisasie - wat jy hoef te wees baie versigtig. 'N bietjie makliker as jy 'n pre-gerol serializer gebruik soos Protobuf-net ( wat direk kan integreer in WCF, en wat ontwerp met rekbaarheid in gedagte), maar nie maklik nie.

Eintlik is een voordeel van die deel van die klasse is dat dit maak dit 'n bietjie makliker te toets: omdat jy dieselfde IFoo het oral, kan jy dit IFoo met 'n redelike kans op sukses te bespot. Dit is moeiliker om te spot as die gevolmagtigde betrokke raak (as jy meer bewegende dele tussen die toets kode en die produksie-kode te verander).

Ander wenke

As die tipe wat jy wil om terug te keer van jou diens oproep is nie gemerk as 'n DataContract dan sal jy nie in staat wees om dit weer uit WCF sonder om 'n afskrif van daardie selfde vergadering om jou kliënt aansoek.

using System;
using System.ServiceModel;

[ServiceContract]
interface IService
{
    [OperationContract]
    TimeSpan GetTimeSpan();
}

class Service : IService
{
    public TimeSpan GetTimeSpan() { return DateTime.Now.TimeOfDay; }
}

Waarom dan die vorige kode werk? Dit werk omdat beide kante van die diens oproep het System.dll sodat hulle albei weet oor die System.TimeSpan tipe wat is die terugkeer tipe van die OperationContract GetTimeSpan().

Hier is 'n voorbeeld gebruik van 'n DataContract:

using System;
using System.ServiceModel;
using System.Runtime.Serialization;

[ServiceContract]
interface IService
{
    [OperationContract]
    Contract GetContract();
}

[DataContract]
class Contract
{
    [DataMember]
    public String MyProperty { get; set; }
}

class Service : IService
{
    public Contract GetContract() { return new Contract(); }
}

Nou kan jy verskaf het serialisasie skryf aan 'n klas wat jy het gedefinieer (Contract) -. Dit sal jou toelaat om svcutil.exe gebruik om volmag klasse in jou kliënt aansoek wat sal serialized en gestuur word aan die BWF diens te skep

As jy nou wil 'n tipe wat nie 'n DataContract moet jy 'n afskrif van die vergadering met daardie tipe om jou kliënt aansoek verskaf terugkeer.

Een van die dinge wat sal moet gebeur, is dat die gebruiker die diens verwysing moet instel om jou soorte gebruik van die DLL eerder as die klas bepaal word deur die proxy - http://msdn.microsoft.com/en-us/library/bb628653.aspx

Ons het af geloop daardie pad in die verlede, en inderdaad die probleem is dat, natuurlik, dit is twee verskillende klasse, so jy sal moet die skakel wat deur @Rich Reuter volg;

Ons het egter die harde manier geleer waarom dit sleg praktyk as dit gaan wat ondervra die 3de beginsel van SOA- "Dienste aandeel skema en kontrak, nie klas".

Natuurlik die probleem is nie net nie ná 'n "reël" deur iemand wat aan 'n sekere punt, maar dat daar 'n groot redes hiervoor word voorgestel - ons het geleer dat die prys van so 'n stywe koppeling tussen die diens en die kliënt beteken dit is baie moeilik om te vry te laat nie - indien die diens moet na 'n ander veld op daardie klas by te voeg, om 'n ander kliënt diens - die eerste kliënt kan beïnvloed; indien die diens as behoeftes om iets in daardie klas definisie verander (na 'n ander kliënt diens) - die eerste kliënt sal weer geraak word, en omgekeerd - die kliënt kan die lewensiklus van die diens beïnvloed.

In groot projekte dit word vinnig 'n groot onderhoud las.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top