2013-05-06 19 views
8

Sto consumando un servizio Web SOAP. Il servizio web designa un URL di servizio separato per ciascuno dei suoi clienti. Non so perché lo fanno. Tutte le loro funzioni e parametri sono tecnicamente le stesse. Ma se voglio scrivere un programma per il servizio che devo conoscere per ogni azienda è previsto. Ciò significa che per una società chiamata "mela" devo usare la seguente istruzione using:"utilizzo" di due diverse librerie con funzioni quasi identiche

using DMDelivery.apple; 

e per l'altro chiamato "arancione"

using DMDelivery.orange; 

Ma vorrei il mio programma di lavoro per tutti e hanno come nome il nome dell'azienda o il punto di riferimento del servizio.

Aggiornamento: Se devo scrivere un'applicazione separata per ogni cliente, allora avrei dovuto mantenerle tutte aggiornate con l'altro con ogni piccolo cambiamento e che sarebbe un diavolo di un lavoro inefficiente come il numero di i clienti aumentano

Qualcuno può pensare a una soluzione? Sarò grato

+0

Immagino che tu stia attualmente aggiungendo il riferimento al servizio web usando "Aggiungi riferimento servizio", ho ragione? –

+1

Penso che potresti voler usare un modello di adattatore o qualche altro modello di progettazione (anche in questo caso viene in mente Facade). –

+0

cosa c'è dentro ogni spazio dei nomi? modello + contratto? evento se DMDelivery.apple.MyFunction e DMDelivery.orange.MyFunction sembra essere lo stesso metodo, non è lo stesso di fatto. è un po 'più complicato. – Cybermaxs

risposta

3

Se si dispone di un contratto di base (interfaccia) per tutti i servizi che è possibile utilizzare una sorta di factory istanziare il vostro servizio concreto e hanno solo un riferimento per l'interfaccia nel codice del client (codice chiamante).

//service interface 
public interface IFruitService{ 
    void SomeOperation(); 
} 

//apple service 
public class AppleService : IFruitService{ 
    public void SomeOperation(){ 
    //implementation 
    } 
} 

Avere ad esempio una sorta di classe factory (si può mettere le using dichiarazioni qui)

public static class ServiceFactory{ 
    public static IFruitService CreateService(string kind){ 
    if(kind == "apple") 
     return new AppleService(); 
    else if(kind == "orange") 
     return new OrangeService(); 
    else 
     return null; 
    } 
} 

E nel tuo codice chiamante (basta aggiungere un using economico del namespace che contiene l'interfaccia) :

string fruitKind = //get it from configuration 
IFruitService service = ServiceFactory.CreateService(fruitKind); 
service.SomeOperation(); 

È inoltre possibile utilizzare il principio Dependency Injection.

+0

significa che dovrei avere un'implementazione separata del servizio per ogni cliente (uno per Apple e uno per Orange) mentre quasi tutte le loro funzioni sono le stesse? Questo raddoppierà la dimensione del mio codice. – Disasterkid

+1

No, quello che cerco di mostrare è che ogni servizio ha la sua implementazione e, come dici tu "quasi tutte le loro funzioni sono le stesse", allora puoi creare un'interfaccia (o una classe base) che "nasconde" l'implementazione al chiamare il codice. In questo caso, il tuo codice chiamante non sa se sta funzionando con un servizio "mela" o "arancione", ma sa solo che sta funzionando con un'implementazione di un'interfaccia 'IFruitService' (o una classe base comune). In questo modo scrivi solo ** una volta ** il codice per il tuo cliente (codice chiamante). – polkduran

+0

sembra ragionevole. e l'istanza del servizio da chiamare (se mela o arancione) sarà un parametro di input giusto? – Disasterkid

0

Se tutto è uguale ed è solo l'indirizzo dell'endpoint diverso, è possibile provare a modificarlo solo prima di richiamare i metodi del servizio Web.

MyWebServiceObject ws= new MyWebServiceObject(); 
ws.Endpoint.Address = new System.ServiceModel.EndpointAddress("http://www.blah.com/apple.asmx"); 
+0

Ho molte classi nel mio programma. Cosa dovrei fare con tutte quelle istruzioni "using"? C'è un modo per annunciare globalmente un'istruzione using che si applica a tutte quelle classi? Come "Aggiungi importazione utente" in VB.Net. – Disasterkid

0
  1. Utilizzare qualsiasi cliente nell'implementazione. ex. Apple
  2. Scrivere un messaggio di ispezione e collegarlo al punto di uscita
  3. Nella finestra di ispezione messaggi sostituire lo spazio dei nomi del tipo con lo spazio dei nomi del client appropriato. EX: Prima di Message Inspector: MyClinet.Apple.Type
    Dopo Message Inspector: MyClient.Orange.Type, se il Provider è arancione.
Problemi correlati