Domanda

Aggiunta di un servizio di riferimento per un servizio web (questo è tutto, WCF) in Visual Studio produce codice generato, tra cui un client di rideterminazione dell'interfaccia di essere esposti.

Comprendo il perché di questa interfaccia è generato:potrebbe essere il consumo di un 3rd party-service e non hanno accesso all'interfaccia vera e propria.

Ma io sì, e i due sono non assegnazione compatibile anche se il proxy trasparente, infatti esattamente implementare l'interfaccia a cui voglio cast.

Posso utilizzare la reflection, ma di brutto.C'è qualche modo per sconfiggere questo finto tipo di sicurezza e di inserire i metadati in modo che posso usare un'interfaccia con una classe?


Il mio problema specifico, si discosta dalla norma in modo complicato che hanno a che fare con un unico client che utilizza alcuni derivati di una classe base, direttamente e utilizza gli altri a distanza tramite i riferimenti al servizio.La classe di base per ogni server ha bisogno di mantenere i riferimenti ai propri clienti una collezione per l'enumerazione di notificare gli eventi, e il problema era di tipo vario, grazie all'uso di proxy.

Nessuna di queste risposte risolve il mio problema specifico, ma ogni singola risposta è stato molto istruttivo e utile.Ho trovato la mia soluzione (l'uso di un doppio legame), ma non avrei mai capito se non fosse radicalmente migliorato la mia comprensione di tutto il business.

Tre risposte eccellenti.Come scegliere solo uno?Io scelgo la prima, perché ha risolto il problema ho pensiero Che ho avuto.

È stato utile?

Soluzione

Quando si aggiunge il servizio di riferimento, vai su "Avanzate" e assicurarsi che "il Riutilizzo tipi di assembly di riferimento" sia selezionata e che l'assemblea contenente la definizione dell'interfaccia selezionata.È anche possibile fare questo con un servizio esistente di riferimento, facendo clic destro su di esso e andare su "Configura".

Altri suggerimenti

Se hai già il contratto di dll al client, non hai nemmeno bisogno di un servizio di riferimento (a meno che non si sta usando per scrivere il codice di installazione per voi) - si può semplicemente sottoclasse ClientBase ed esporre il Canale, e l'uso che direttamente qualcosa di simile (non IDE a portata di mano...):

public class WcfClient<T> : ClientBase<T> where T : class
{
    public new T Channel {get {return base.Channel;}}
}

Quindi si può solo fare cose come:

using(var client = new WcfClient<IFoo>())
{
    client.Channel.Bar(); // defined by IFoo
}

Hai ancora bisogno le impostazioni di configurazione nel file config per determinare l'indirizzo, l'associazione, ecc - ma meno disordinato di generazione del proxy.Inoltre, si può scegliere di re-implementare IDipsoable per affrontare il fatto che WCF proxy può buttare in Dispose() (il che è un male):

public class WcfClient<T> : ClientBase<T>, IDisposable where T : class
{
    public new T Channel {get {return base.Channel;}}
    void IDisposable.Dispose() {
        try {
           switch(State) {
              case CommunicationState.Open: Close(); break;
              // etc
           }
        } catch {} // swallow it down (perhaps log it first)
    }
}

Per la restituzione di un'interfaccia di un servizio di cui hai bisogno per utilizzare il KnownType attributo:

Fa qualche aiuto?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top