Использование более метода ООП вместо операторов switch для вызовов веб-службы SOAP - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь выяснить, есть ли лучший способ выполнить то, что у меня есть ниже. У нас есть несколько (12) веб-сервисов SOAP от одного поставщика. Таким образом, все вызовы одинаковы (например, getclaim (), editclaim (), addclaim () и т. Д. И т. Д.)

ех. URL двух веб-сервисов

https://trustonline.delawarecpf.com/tows/webservicefk.svc https://trustonline.delawarecpf.com/tows/webservicepcc.svc

Но у нас есть все вызовы ws в отдельных файлах (супер избыточных), по одному для каждой веб-службы. Поэтому я пытаюсь понять, как объединить их в один файл.

Я думаю, что может сделать что-то подобное ниже, где у меня есть оператор switch или if, который определяет веб-сервис и объект User из каждого сервиса, но это выглядит немного не ориентированным на obj, поэтому я смотрю, если есть лучший способ?

Вот что я сейчас делаю, но ищу лучший способ.

    // initializing the web services and fetching some data at the end
    public void InitWebService(string webserviceUrl, int webServiceType)
    { 
        BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
        EndpointAddress endpoint = new EndpointAddress(webserviceUrl);

        ChannelFactory channelFactory = null;
        switch(webServiceType)
        {
            case 1:
                channelFactory = new ChannelFactory<WebServiceAWI>(binding, endpoint);
                break;
            case 2:
                channelFactory = new ChannelFactory<WebServiceBG>(binding, endpoint);
                break;
            etc.
        }            

        var webservice = channelFactory.CreateChannel();
        var user = null; // CAN'T HAVE NULL HERE
        switch(webServiceType)
        {
            case 1:
                user = WebservicereferenceA.User();
                break;
            case 2:
                user = WebserviceReferenceB.User();
                break;
            etc.
        }

        user.UserName = webservice.EncryptValue("someone");
        user.Password = webservice.EncryptValue("password");

        // get some data
        var result = webservice.AttorneysGet(user);
    }

1 Ответ

0 голосов
/ 11 июля 2019

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

Я бы, вероятно, рассмотрел вопрос об изменении int дляenum.Что-то вроде:

public enum ServiceType
{
    A,
    B
}

public class ServiceFactory 
{
    public ChannelFactory CreateChannelFactory(ServiceType type, BasicHttpBinding binding, EndpointAddress endpoint) 
    {
        switch(type) 
        {
            case ServiceType.A: 
                return new ChannelFactory<WebServiceAWI>(binding, endpoint);
            case ServiceType.B:
                return new ChannelFactory<WebServiceBG>(binding, endpoint);
            default:
                throw new NotSupportedException();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...