2013-05-06 1 views
8

Я использую веб-службу SOAP. Веб-служба назначает отдельный URL-адрес службы для каждого из своих клиентов. Я не знаю, почему они это делают. Все их функции и параметры технически одинаковы. Но если я хочу написать программу для службы, которую я должен знать, для каждой компании она предназначена. Это означает, что для компании под названием «яблоко» я должен использовать следующее, используя оператор:«использование» двух разных библиотек с почти идентичными функциями

using DMDelivery.apple; 

и другой называемой «оранжевой»

using DMDelivery.orange; 

Но я хотел бы, чтобы моя программа работать на все они имеют название компании или контрольную точку обслуживания в качестве параметра.

Update: Если я должен написать отдельное приложение для каждого клиента, то я должен был бы держать все они обновляемые друг с другом с каждым небольшим изменением, и это будет одна из черт неэффективной работы, как количество клиенты увеличиваются.

Может ли кто-нибудь подумать о решении? Я буду благодарен.

+0

Я думаю, вы в настоящее время добавляете ссылку на веб-службу с помощью «Добавить ссылку на службу», правильно? –

+1

Я думаю, вы можете использовать шаблон адаптера или какой-либо другой шаблон дизайна (на ум приходит и Фасад). –

+0

Что внутри каждого пространства имен? модель + контракт? событие, если DMDelivery.apple.MyFunction и DMDelivery.orange.MyFunction похоже на тот же метод, это не то же самое на самом деле. это немного сложнее. – Cybermaxs

ответ

3

Если у вас есть базовый контракт (интерфейс) для всех услуг, которые вы можете использовать свой род factory, чтобы создать экземпляр конкретной услуги и имеете только ссылку на ваш интерфейс в коде клиента (вызывающий код).

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

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

Имея, например, своего рода фабрики класса (вы можете поместить свои using заявления здесь)

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; 
    } 
} 

И в вашем коде вызова (вы просто добавить using заявление для пространства имен, содержащее ваш интерфейс) :

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

Вы также можете использовать принцип Dependency Injection.

+0

это означает, что у меня должна быть отдельная реализация услуги для каждого клиента (одна для Apple и одна для Orange), в то время как почти все их функции одинаковы? Это удвоит размер моего кода. – Disasterkid

+1

Нет, я пытаюсь показать, что каждая служба имеет свою собственную реализацию, и, как вы говорите, «почти все их функции одинаковы», тогда вы можете создать интерфейс (или базовый класс), который «скрывает» реализацию до вызывающий код. В этом случае ваш код вызова не знает, работает ли он с «яблочным» или «оранжевым» сервисом, он знает только, что он работает с реализацией интерфейса «IFruitService» (или общего базового класса). Таким образом, вы только записываете ** один раз ** код для вашего клиента (код вызова). – polkduran

+0

это звучит разумно. и экземпляр услуги для вызова (будь то яблоко или оранжевый) будет правильным параметром ввода? – Disasterkid

0

Если все одно и то же, и только адрес конечной точки отличается, возможно, вы можете попробовать изменить только это, прежде чем ссылаться на методы веб-службы.

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

У меня есть много классов в моей программе. Что я должен делать со всеми этими «использующими» заявлениями? Есть ли способ объявить глобальное заявление о применении, которое применяется ко всем этим классам? Как «Добавить импорт пользователя» в VB.Net. – Disasterkid

0
  1. Используйте любой одного клиента в вашей реализации. ех. Apple
  2. Напишите инспектору сообщения и приложите его к следующему пункту
  3. В инспекторе сообщений замените пространство имен типа на подходящее пространство имен клиентов. EX: Перед инспектором сообщений: MyClinet.Apple.Type
    После Message Inspector: MyClient.Orange.Type, если поставщик оранжевый.
Смежные вопросы