Понимание шаблона "адаптер"

аутентификация-сертификат - это политика, которая позволяет APIM использовать сертификат для аутентификации в бэкэнд-сервисе, а не в вызывающем APIM клиента. Поскольку вы тестируете в браузере, я предполагаю, что вы хотите настроить пользовательский домен с пользовательским сертификатом, см. Здесь: https://docs.microsoft.com/en-us/azure/api-management/configure-custom- домен

29
задан Richard Slater 5 July 2016 в 15:20
поделиться

2 ответа

Обычно шаблон адаптера преобразует один интерфейс в другой, но он может просто обернуть поведение, чтобы изолировать ваш класс от базовой реализации. В вашем случае вы используете адаптер, но вы могли бы так же легко определить объекты DAO, чтобы просто реализовать интерфейс и запрограммировать его на основе интерфейса. Шаблон адаптера обычно используется, когда у вас нет контроля над целевым классом. В основном я использую шаблон адаптера для создания оболочек для класса фреймворка, который не реализует интерфейс.

Скажем, я хочу имитировать класс фреймворка, который не реализует интерфейс (и не имеет виртуального методы). Со многими издевательскими API это сделать сложно или невозможно. Что я сделаю, так это определю свой собственный интерфейс как подмножество сигнатуры класса I ' м нацеливания. Я реализую класс оболочки, который реализует этот интерфейс и просто делегирует вызовы классу оболочки в оболочке. Этот класс-оболочка работает как адаптер для класса фреймворка. Мои классы используют этот адаптер вместо класса фреймворка, но получают поведение класса фреймворка.

 public interface IFoo
 {
     void Bar();
 }

 public class FooWrapper : IFoo
 {
      private FrameworkFoo Foo { get; set; }

      public FooWrapper( FrameworkFoo foo )
      {
           this.Foo = foo;
      }

      public void Bar()
      {
           this.Foo.Bar();
      }
 }

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

Классы каркаса:

public class TargetA
{
    public void Start() { ... }
    public void End() { ... }
}

public class TargetB
{
    public void Begin() { ... }
    public void Terminate() { ... }
}

Адаптер для них

public interface ITargetAdapter
{
    void Open();
    void Close();
}

public class AdapterA : ITargetAdapter
{
     private TargetA A { get; set; }

     public AdapterA( TargetA a )
     {
           this.A = a;
     }

     public void Open() { this.A.Start(); }
     public void Close() { this.A.End(); }
}

public class AdapterB : ITargetAdapter
{
     private TargetB B { get; set; }

     public AdapterB( TargetB a )
     {
           this.B = a;
     }

     public void Open() { this.B.Begin(); }
     public void Close() { this.B.Terminate(); }
}

Затем используется как:

ITargetAdapter adapter = new AdapterA( new TargetA() );
adapter.Open();
adapter.Close();     
79
ответ дан 28 November 2019 в 00:51
поделиться

А очень простой пример...

 interface ITarget
    {
      List<string> GetProducts();
    }


    public class VendorAdaptee
    {
       public List<string> GetListOfProducts()
       {
          List<string> products = new List<string>();
          products.Add("Gaming Consoles");
          products.Add("Television");
          products.Add("Books");
          products.Add("Musical Instruments");
          return products;
       }
    }


    class VendorAdapter:ITarget
    {
       public List<string> GetProducts()
       {
          VendorAdaptee adaptee = new VendorAdaptee();
          return adaptee.GetListOfProducts();
       }
    }


    class ShoppingPortalClient
    {
       static void Main(string[] args)
       {
          ITarget adapter = new  VendorAdapter();
          foreach (string product in adapter.GetProducts())
          {
            Console.WriteLine(product);
          }
          Console.ReadLine();
       }
    }
0
ответ дан 28 November 2019 в 00:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: