Wrapping del client WCF con Stream per lo smaltimento

0

Ho bisogno di consumare dati da un servizio WCF, che li canalizza attraverso un flusso. I dati stessi sono contenuti di un file di archivio, quindi richiede una logica aggiuntiva, che sto dividendo in una classe separata.

Ora, normalmente, userei un paio di istruzioni% co_de nidificate, in questo modo:

// Inside class that does the retrieval
using (var client = new FooWcfServiceClient(endpointName))
{
    // Some logic for specifying the request
    using (var dataStream = client.SomeMethod(request))
    {
        // Consuming logic goes here
    }
}

Ma non voglio che la mia classe di recupero dall'alto dipenda dalla classe che esegue il lavoro effettivo su using .

Ma ciò significa che ho bisogno in qualche modo di passare un flusso aperto al di fuori del metodo sopra, senza chiudere la connessione.

La soluzione che ho trovato è semplicemente creare un decoratore come questo:

class DisposingStreamDecorator : Stream, IDisposable

e quindi semplicemente passa sia il client che lo stream originale nel decoratore, per essere smaltiti più tardi all'interno di dataStream . Allo stesso tempo, tutti gli altri membri, ereditati da Dispose() , vengono passati allo stream che avvolge.

Questa è una pessima decisione di progettazione? Ci sono problemi che non vedo?

    
posta Heagon 27.09.2018 - 08:53
fonte

1 risposta

1

But I do not want my retrieval class from above to be dependent on the class that does the actual work on the dataStream.

Ecco a cosa servono le astrazioni. Se si inietta questa dipendenza, si evita di associare strettamente il proprio codice a tale dipendenza. E tu eviti il problema che stai cercando di evitare che Dispose venga chiamato troppo presto.

Quindi il tuo codice potrebbe essere simile a:

void Foo(Action<Stream> consume)
{
    using (var client = new FooWcfServiceClient(endpointName))
    {
        // Some logic for specifying the request
        using (var dataStream = client.SomeMethod(request))
        {
            consume(dataStream);
        }
    }
}
    
risposta data 27.09.2018 - 10:50
fonte

Leggi altre domande sui tag