Вот то, что я делал в прошлом, оно хорошо вписывается в Dependency Injection / контейнеры, если вы используете это также. Ключевым моментом здесь является определение единого интерфейса, который будут реализованы всеми сервисами. Ваш код, который использует это, должен использовать только интерфейс.
Каждый класс должен реализовывать интерфейс, который вы определяете, например, IWebServiceOperations
public interface IWebServiceOperations
{
WebServiceOperationResult GetFooAsync(WebServiceOperationRequest request);
}
Я оставлю вас для выяснения классов WebServiceOperationResult / Request, они просто содержат переменные вашего запроса / ответа, включая учетные данные.
Тогда каждый веб-сервис, который вам нужно реализовать, делается в отдельном классе. Вы также указываете в конструкторе, какой это тип реализации (FooSoap1 против FooSoap2), например:
public class FooSoapClient : BaseClient, IWebServiceOperations
{
public FooSoapClient() : base(Clients.FooSoap1)
public GetFooAsync(...)
{
...
}
}
public class BaseClient
{
private readonly eFooServiceType _serviceType;
public eFooServiceType ServiceType {
get{
return _serviceType;
}
}
protected BaseClient(eFooServiceType service)
{
_serviceType = service;
}
}
Теперь у вас должна быть куча ссылок на классы. Либо ваш DI-контейнер может разрешить их для вас в зависимости от типа службы, которую вы хотите, либо вы можете добавить их в словарь, поэтому, если вы хотите работать с FooSoap1, вам нужно ...
var fooSoapClient1 = myServices[Clients.FooSoap1];
await fooSoapClient1.GetFooAsync(...)