Разработка шаблона для регистрации обработчика (провайдера) для обработки типов запросов - PullRequest
0 голосов
/ 16 мая 2018

У меня есть сценарий, где у меня есть коллекция объектов. Данные разных объектов хранятся в разных источниках данных. Я ищу шаблон проектирования для регистрации поставщиков данных (уже есть несколько поставщиков данных) для различных объектов. Мне нужна гибкость, чтобы добавить новый тип объектов и зарегистрировать обработчик для извлечения данных для этих объектов.

например. Мне нужно отобразить список городов. У меня есть информация о городе в таблице MySQL. например идентификатор, имя, штат, страна. Мне также нужно отображать информацию о погоде, которая поступает от стороннего сервиса. Мне также нужно отобразить некоторую другую информацию, которая хранится в монго. например население, уровень грамотности и т. д.

Мне нужно получить все вышеперечисленные данные от разных поставщиков данных и отобразить их в виде таблицы. Мне нужна гибкость, чтобы добавить больше типа таких данных.

Есть несколько шаблонов, которые, я думаю, могут быть использованы для решения некоторой части проблемы, например шаблон командования, шаблон наблюдателя, цепь ответственности, стратегия и т. д.

Я бы хотел, чтобы код был

$objects = [$cityMetadata, $weather, $demographic];

$dataProviderRegistry->register($cityMedatadaProvider);
$dataProviderRegistry->register($weatherDataProvider);
$dataProviderRegistry->register($demographicDataProvider);       

foreach ($objects as $object) {
   $data = $dataProviderRegistry->get($object);
}

Я бы хотел, чтобы DataProviderRegistry выбрал правильного поставщика для зарегистрированного объекта для обработки этого типа объекта. Я должен быть в состоянии зарегистрировать новый тип провайдера в реестре для обработки новых типов объектов.

Я не уверен, как можно применить один или несколько типов шаблонов проектирования для решения этой конкретной проблемы.

class WeatherDataProvider
{
     public function getType()
    {
        return "Weather";
    }

    public function getData()
    {
        //fetch data
    }

}


Class Weather 
{

     public function getType()
    {
        return "Weather";
    }    

}

class DataProviderRegistry
{

    private $providers = [];

    public function register(DataProviderInterface $provider)
    {
        $this->providers[$provider->getType()] = $provider;
    }

    public function get($object)
    {
        return $this->providers[$object->getType()]->getData();
    }
}

1 Ответ

0 голосов
/ 16 мая 2018

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

Вы даже можете настроить его так, чтобы при сохранении или заполнении сущности «хранилище» выбирало соответствующий сопоставитель данных. на основании get_class($entity). Таким образом, вы сможете еще больше упростить внешний интерфейс.

И в каждом картографе данных вы можете поместить код для работы с любой необходимой абстракцией (sql, cache, rest и т. Д.).

TL; DR

Используйте шаблон хранилища в качестве основы, а затем измените его в соответствии с вашими потребностями.

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