доступ к рекомендациям веб-сервисов нескольких конечных точек (ASMX) в c # - PullRequest
0 голосов
/ 29 октября 2018

У меня есть проект чистой архитектуры, который предоставляет микро-сервисы, один из которых - доступ к веб-сервисам Agresso ERP.

https://***************/service.svc

это предоставляет много услуг

  • https://**/service.svc?FooService/Foo
  • https://**/service.svc?BooService/Boo

каждый из которых имеет свою собственную ссылку на службу (подключенный сервис), и каждый из которых имеет много методов.

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

        var fooSoapClient = new FooSoapClient();
        var credentials = new WSCredentials
        {
            Username = "fakeuser",
            Password = "fakepassword",
            Client = "fakeclient",
        };
        var result =  fooSoapClient.GetFoosAsync(Foo filter,true,
                      credentials ); 

(P.S) класс учетных данных существует во всех сущностях

namespace Foo1NS
{
  public partial class WSCredentials : object
  {
     public string Username {get;set;}

     public string Client {get;set;}

     public string Password {get;set;}
  }
}


 namespace Foo2NS
{
  public partial class WSCredentials : object
  {
     public string Username {get;set;}

     public string Client {get;set;}

     public string Password {get;set;}
  }
}

я могу получить доступ ко всем конечным точкам без проблем.

У меня есть следующие вопросы:

  • Есть ли общее решение, которому я могу следовать, чтобы не упасть в СУХОЙ?
  • Существует ли шаблон проектирования, который лучше всего нацелен на эту проблему?

1 Ответ

0 голосов
/ 29 октября 2018

Вот то, что я делал в прошлом, оно хорошо вписывается в 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(...)
...