示例#1
0
        /// <summary>
        /// Паттерн "Адаптер" преобразует интерфейс класса к другому интерфейсу, на который рассчитан клиент.
        /// Адаптер обеспечивает совместную работу классов, невозможную в обычных условиях из-за несовместимости интерфейсов.
        /// </summary>
        public void DemoAdapter()
        {
            // Эта строка необходима для загрузки сборки DesignPatternDemos.Adapter в домен
            var loadAssembly = new PopulationInfoTcpService();

            // Будем считать, что код ниже имитирует получение зарегистрированных имплементаций через DI-контейнер
            var services = AppDomain.CurrentDomain.GetAssemblies()
                           .FirstOrDefault(x => x.GetName().Name == "DesignPatternDemos.Adapter")?
                           .GetTypes()
                           .Where(x => typeof(DesignPatternDemos.Adapter.IHttpService).IsAssignableFrom(x) && !x.IsInterface);

            var results = new List <string>();

            // Инициализация сервисов и получения результата их работы
            foreach (var service in services)
            {
                Adapter.IHttpService serviceInstance;
                // Этот сервис требует зависимости, поэтому экземпляр для него создается через параметризованный конструктор
                if (service == typeof(PopulationInfoTcpServiceAdapter))
                {
                    serviceInstance = (Adapter.IHttpService)Activator.CreateInstance(service, new PopulationInfoTcpService());
                }
                else
                {
                    serviceInstance = (Adapter.IHttpService)Activator.CreateInstance(service);
                }

                results.Add(serviceInstance.GetResultFromHttp());
            }
        }
 public PopulationInfoTcpServiceAdapter(PopulationInfoTcpService populationInfoTcpService)
 {
     _populationInfoTcpService = populationInfoTcpService;
 }